-
Type:
Improvement
-
Resolution: Done
-
Priority:
Minor - P4
-
None
-
Affects Version/s: 2.6.0-rc0
-
Component/s: Write Ops
-
None
-
None
-
0
-
None
-
None
-
None
-
None
-
None
-
None
The steps:
Step 1.
Add an object {_id : 1, a : [1, 2]} to the empty collection test:
> db.test.drop() > db.test.insert({_id : 1, a : [1, 2]})
Step 2.
Let's try to pull from a[-2], i.e. from non existent data. This is nonsense perhaps but it changed behaviour.
> db.test.update({_id : 1}, {$pull : {"a.-2" : 1}}) WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0, "writeError" : { "code" : 16837, "errmsg" : "cannot use the part (a of a.-2) to traverse the element ({a: [ 1.0, 2.0 ]})" } })
The above pull fails and data are not changed. In v2.4.9 this nonsense pull was silently ignored. New behaviour is better, more likely.
Step 3.
Now let's pop from a[3], i.e. also from non existent data.
> db.test.update({_id : 1}, {$pull : {"a.3" : 1}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Unlike step 2, the step 3 does not fail. It is silently ignored. I think it would be better if the results are consistent, i.e. both fails or ignored. Personally, failures are more expected and informative.
P.S. Related or not, but $pop also changed, probably incorrectly, see the similar steps in
https://jira.mongodb.org/browse/SERVER-12846