datacarl
datacarl

Reputation: 2781

Update document in Meteor mini-mongo without updating server collections

In Meteor, I got a collection that the client subscribes to. In some cases, instead of publishing the documents that exists in the collection on the server, I want to send down some bogus data. Now that's fine using the this.added function in the publish.

My problem is that I want to treat the bogus doc as if it were a real document, specifically this gets troublesome when I want to update it. For the real docs I run a RealDocs.update but when doing that on the bogus doc it fails since there is no representation of it on the server (and I'd like to keep it that way).

A collection API that allowed me to pass something like local = true this would be fantastic but I have no idea how difficult that would be to implement and I'm not to fond of modifying the core code.

Right now I'm stuck at either creating a BogusDocs = new Meteor.Collection(null) but that makes populating the Collection more difficult since I have to either hard code fixtures in the client code or use a method to get the data from the server and I have to make sure I call BogusDocs.update instead of RealDocs.update as soon as I'm dealing with bogus data.

Maybe I could actually insert the data on the server and make sure it's removed later, but the data really has nothing to do with the server side collection so I'd rather avoid that.

Any thoughts on how to approach this problem?

Upvotes: 9

Views: 3072

Answers (5)

Tom Freudenberg
Tom Freudenberg

Reputation: 1367

Maybe this interesting for you as well, I created two examples with native Meteor Local Collections at meteorpad. The first pad shows an example with plain reactive recordset: Sample_Publish_to_Local-Collection. The second will use the collection .observe method to listen to data: Collection.observe().

Upvotes: 0

datacarl
datacarl

Reputation: 2781

After some further investigation (the evented mind site) it turns out that one can modify the local collection without making calls to the server. This is done by running the same methods as you usually would, but on MyCollection._collection instead of just on Collection. MyCollection.update() would thus become MyCollection._collection.update(). So, using a simple wrapper one can pass in the usual arguments to a update call to update the collection as usual (which will try to call the server which in turn will trigger your allow/deny rules) or we can add 'local' as the last argument to only perform the update in the client collection. Something like this should do it.

DocsUpdateWrapper = function() {
  var lastIndex = arguments.length -1;
  if (arguments[lastIndex] === 'local') {
    Docs._collection.update(arguments.slice(0, lastIndex);
  } else {
    Docs.update(arguments)
  }
}

(This could of course be extended to a DocsWrapper that allows for insertion and removals too.)(Didnt try this function yet but it should serve well as an example.)

The biggest benefit of this is imo that we can use the exact same calls to retrieve documents from the local collection, regardless of if they are local or living on the server too. By adding a simple boolean to the doc we can keep track of which documents are only local and which are not (An improved DocsWrapper could check for that bool so we could even omit passing the 'local' argument.) so we know how to update them.

Upvotes: 20

Jim Mack
Jim Mack

Reputation: 1437

You can also set up a local minimongo collection. Insert on callback

@FoundAgents = new Meteor.Collection(null, Agent.transformData )

  FoundAgents.remove({})
  Meteor.call 'Get_agentsCloseToOffer', me, ping, (err, data) ->
    if err
      console.log JSON.stringify err,null,2
    else
      _.each data, (item) ->
        FoundAgents.insert  item

Upvotes: 0

Jim Mack
Jim Mack

Reputation: 1437

I would use the transform feature on the collection to make an object that knows what to do with itself (on client). Give it the corruct update method (real/bogus), then call .update rather than a general one.

You can put the code from this.added into the transform process.

Upvotes: 0

user2502
user2502

Reputation: 99

There are some people working on local storage in the browser https://github.com/awwx/meteor-browser-store You might be able to adapt some of their ideas to provide "fake" documents.

Upvotes: 0

Related Questions