summaryrefslogtreecommitdiff
path: root/jstests/core/find_and_modify4.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/core/find_and_modify4.js')
-rw-r--r--jstests/core/find_and_modify4.js55
1 files changed, 55 insertions, 0 deletions
diff --git a/jstests/core/find_and_modify4.js b/jstests/core/find_and_modify4.js
new file mode 100644
index 00000000000..04abc2f1ce7
--- /dev/null
+++ b/jstests/core/find_and_modify4.js
@@ -0,0 +1,55 @@
+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);
+