[SERVER-12846] v2.6.0-rc0 update $pop - changed behaviour + removes incorrect data Created: 23/Feb/14  Updated: 11/Jul/16  Resolved: 12/Mar/14

Status: Closed
Project: Core Server
Component/s: Write Ops
Affects Version/s: 2.6.0-rc0
Fix Version/s: 2.6.0-rc2

Type: Bug Priority: Minor - P4
Reporter: Roman Kuzmin Assignee: Scott Hernandez (Inactive)
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Backwards Compatibility: Major Change
Operating System: ALL
Participants:

 Description   

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 pop from a[-2], i.e. from non existent data. This is nonsense perhaps but it changed behaviour.

> db.test.update({_id : 1}, {$pop : {"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 pop fails and data are not changed. In v2.4.9 this nonsense pop was silently ignored (if I am not mistaken).

Step 3.
Now let's pop from a[3], i.e. also from non existent data.

> db.test.update({_id : 1}, {$pop : {"a.3" : 1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
 
> db.test.find()
{ "_id" : 1, "a" : [ 1 ] }

The result is presumably incorrect. {$pop : {"a.3" : 1}} instead of failing (like with a.-2 in v2.6) or doing nothing (like with the same case in v2.4.9) it removes data from 'a' itself, i.e. actually performs another operation: {$pop : {"a" : 1}}.



 Comments   
Comment by Githook User [ 12/Mar/14 ]

Author:

{u'username': u'scotthernandez', u'name': u'Scott Hernandez', u'email': u'scotthernandez@gmail.com'}

Message: SERVER-12846: don't pop nonexistent paths in update
Branch: master
https://github.com/mongodb/mongo/commit/d751c80fe2e4a7922129c5ef47a53b29b9eea728

Comment by Daniel Pasette (Inactive) [ 25/Feb/14 ]

The two cases are a bit different, the first case is an illegal identifier for an array, and thus there is an error.

The second case (step 3.) is consistent with 2.4.9, and is akin to querying for data that does not exist and shouldn't return an error.

The bug here is that the document is modified. Thanks for the report.

Generated at Thu Feb 08 03:29:47 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.