|
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
|