From 0286395700d4e2abcacb1fb34ae89254d4adde48 Mon Sep 17 00:00:00 2001 From: Emily Stark Date: Thu, 26 Sep 2013 14:22:23 -0700 Subject: [PATCH] Actually implement minimongo upsert. Got a little over-confident there... --- packages/minimongo/minimongo.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/minimongo/minimongo.js b/packages/minimongo/minimongo.js index 2596ee5a3b..86fe4df943 100644 --- a/packages/minimongo/minimongo.js +++ b/packages/minimongo/minimongo.js @@ -473,6 +473,7 @@ LocalCollection.prototype.insert = function (doc, callback) { LocalCollection._recomputeResults(self.queries[qid]); }); self._observeQueue.drain(); + // Defer because the caller likely doesn't expect the callback to be run // immediately. if (callback) @@ -589,7 +590,20 @@ LocalCollection.prototype.update = function (selector, mod, options, callback) { qidToOriginalResults[qid]); }); self._observeQueue.drain(); - var result = { numberAffected: updateCount }; + + var insertedId; + if (updateCount === 0 && options.upsert) { + var newDoc = _.clone(selector); + LocalCollection._modify(newDoc, mod); + insertedId = self.insert(newDoc); + updateCount = 1; + } + + var result = { + numberAffected: updateCount + }; + if (insertedId !== undefined) + result.insertedId = insertedId; if (callback) Meteor.defer(function () { callback(null, result);