Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-12847

v2.6.0-rc0 update $pull - changed and inconsistent behaviour

    • Type: Icon: Improvement Improvement
    • Resolution: Done
    • Priority: Icon: Minor - P4 Minor - P4
    • None
    • Affects Version/s: 2.6.0-rc0
    • Component/s: Write Ops
    • Labels:
      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

            Assignee:
            Unassigned Unassigned
            Reporter:
            nightroman Roman Kuzmin
            Votes:
            0 Vote for this issue
            Watchers:
            7 Start watching this issue

              Created:
              Updated:
              Resolved: