summaryrefslogtreecommitdiff
path: root/jstests/core/write/find_and_modify/find_and_modify4.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/core/write/find_and_modify/find_and_modify4.js')
-rw-r--r--jstests/core/write/find_and_modify/find_and_modify4.js53
1 files changed, 53 insertions, 0 deletions
diff --git a/jstests/core/write/find_and_modify/find_and_modify4.js b/jstests/core/write/find_and_modify/find_and_modify4.js
new file mode 100644
index 00000000000..d5b3ae23cb2
--- /dev/null
+++ b/jstests/core/write/find_and_modify/find_and_modify4.js
@@ -0,0 +1,53 @@
+// Cannot implicitly shard accessed collections because of following errmsg: A single
+// update/delete on a sharded collection must contain an exact match on _id or contain the shard
+// key.
+// @tags: [assumes_unsharded_collection, requires_fastcount]
+
+t = db.find_and_modify4;
+t.drop();
+
+// this is the best way to build auto-increment
+function getNextVal(counterName) {
+ var ret = t.findAndModify({
+ query: {_id: counterName},
+ update: {$inc: {val: 1}},
+ upsert: true,
+ 'new': true,
+ });
+ return ret;
+}
+
+assert.eq(getNextVal("a"), {_id: "a", val: 1});
+assert.eq(getNextVal("a"), {_id: "a", val: 2});
+assert.eq(getNextVal("a"), {_id: "a", val: 3});
+assert.eq(getNextVal("z"), {_id: "z", val: 1});
+assert.eq(getNextVal("z"), {_id: "z", val: 2});
+assert.eq(getNextVal("a"), {_id: "a", val: 4});
+
+t.drop();
+
+function helper(upsert) {
+ return t.findAndModify({
+ query: {_id: "asdf"},
+ update: {$inc: {val: 1}},
+ upsert: upsert,
+ 'new': false // the default
+ });
+}
+
+// upsert:false so nothing there before and after
+assert.eq(helper(false), null);
+assert.eq(t.count(), 0);
+
+// upsert:true so nothing there before; something there after
+assert.eq(helper(true), null);
+assert.eq(t.count(), 1);
+assert.eq(helper(true), {_id: 'asdf', val: 1});
+assert.eq(helper(false), {_id: 'asdf', val: 2}); // upsert only matters when obj doesn't exist
+assert.eq(helper(true), {_id: 'asdf', val: 3});
+
+// _id created if not specified
+var out = t.findAndModify({query: {a: 1}, update: {$set: {b: 2}}, upsert: true, 'new': true});
+assert.neq(out._id, undefined);
+assert.eq(out.a, 1);
+assert.eq(out.b, 2);