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

Regression between MongoDB 2.4 and 2.6

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major - P3
    • Resolution: Duplicate
    • Affects Version/s: 2.6.7
    • Fix Version/s: None
    • Component/s: Querying
    • Labels:
      None
    • Operating System:
      ALL
    • Steps To Reproduce:
      Hide

      First insert a test document:

      db.test.insert({ _id: 'iJ7m2eW66eoGjR4tQ',
      nested: 
       [ { required: 
            { _id: 'phitZKwpTqiH76BWS',
              username: 'person2',
              displayName: 'Person 2',
              field1: 'Field 2 - 1',
              field2: 'Field 2 - 2' } },
         { required: 
            { _id: 'phitZKwpTqiH76BWS',
              username: 'person2',
              displayName: 'Person 2' } },
         { required: { _id: 'Pua8HHJQzBbRtua9W' } },
         { required: { _id: 'Pua8HHJQzBbRtua9W' } },
         { required: 
            { _id: 'phitZKwpTqiH76BWS',
              username: 'person2',
              displayName: 'Person 2',
              field1: 'wrong' } },
         { required: { _id: 'Pua8HHJQzBbRtua9W' } }
       ]})
      

      And then run the following update query:

      db.test.update({ 'nested.required._id': 'phitZKwpTqiH76BWS',
        nested: 
         { '$elemMatch': 
            { '$or': 
               [ { 'required._id': 'phitZKwpTqiH76BWS',
                   'required.username': { '$ne': 'person2' } },
                 { 'required._id': 'phitZKwpTqiH76BWS',
                   'required.displayName': { '$ne': 'Person 2' } },
                 { 'required._id': 'phitZKwpTqiH76BWS',
                   'required.field1': { '$ne': 'Field 2 - 1' } },
                 { 'required._id': 'phitZKwpTqiH76BWS',
                   'required.field2': { '$ne': 'Field 2 - 2' } } ] } } }, { '$set': 
         { 'nested.$.required.username': 'person2',
           'nested.$.required.displayName': 'Person 2',
           'nested.$.required.field1': 'Field 2 - 1',
           'nested.$.required.field2': 'Field 2 - 2' } })
      

      If you test number of affected documents with:

      db.runCommand({getLastError : 1})
      

      Then on MongoDB 2.4 it will return number of affected documents "1" for first two runs of the update query, and the third one will be 0. As expected.

      On MongoDB 2.6 update query will be returning:

      WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
      

      And "getLastError" will be returning "1" despite not really updating any document. Here are two issues:

      Number of affected queries is 1 (node.js driver is reporting this as well) despite no document being really modified. This makes our code using this queries go into a loop because it is expecting that there are more things to still update (it is running the update query in a loop until there are no more changes done to the database).

      The second issue is that no document is updated despite one being matched. It is unclear why the same update modifier does not work on 2.6 anymore.

      Show
      First insert a test document: db.test.insert({ _id: 'iJ7m2eW66eoGjR4tQ' , nested: [ { required: { _id: 'phitZKwpTqiH76BWS' , username: 'person2' , displayName: 'Person 2' , field1: 'Field 2 - 1' , field2: 'Field 2 - 2' } }, { required: { _id: 'phitZKwpTqiH76BWS' , username: 'person2' , displayName: 'Person 2' } }, { required: { _id: 'Pua8HHJQzBbRtua9W' } }, { required: { _id: 'Pua8HHJQzBbRtua9W' } }, { required: { _id: 'phitZKwpTqiH76BWS' , username: 'person2' , displayName: 'Person 2' , field1: 'wrong' } }, { required: { _id: 'Pua8HHJQzBbRtua9W' } } ]}) And then run the following update query: db.test.update({ 'nested.required._id' : 'phitZKwpTqiH76BWS' , nested: { '$elemMatch' : { '$or' : [ { 'required._id' : 'phitZKwpTqiH76BWS' , 'required.username' : { '$ne' : 'person2' } }, { 'required._id' : 'phitZKwpTqiH76BWS' , 'required.displayName' : { '$ne' : 'Person 2' } }, { 'required._id' : 'phitZKwpTqiH76BWS' , 'required.field1' : { '$ne' : 'Field 2 - 1' } }, { 'required._id' : 'phitZKwpTqiH76BWS' , 'required.field2' : { '$ne' : 'Field 2 - 2' } } ] } } }, { '$set' : { 'nested.$.required.username' : 'person2' , 'nested.$.required.displayName' : 'Person 2' , 'nested.$.required.field1' : 'Field 2 - 1' , 'nested.$.required.field2' : 'Field 2 - 2' } }) If you test number of affected documents with: db.runCommand({getLastError : 1}) Then on MongoDB 2.4 it will return number of affected documents "1" for first two runs of the update query, and the third one will be 0. As expected. On MongoDB 2.6 update query will be returning: WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 }) And "getLastError" will be returning "1" despite not really updating any document. Here are two issues: Number of affected queries is 1 (node.js driver is reporting this as well) despite no document being really modified. This makes our code using this queries go into a loop because it is expecting that there are more things to still update (it is running the update query in a loop until there are no more changes done to the database). The second issue is that no document is updated despite one being matched. It is unclear why the same update modifier does not work on 2.6 anymore.

      Description

      When testing upgrading of our codebase to 2.6 from 2.4 some of our tests started failing. After analyzing tests we found a sample of failing update query which worked well on 2.4 but does not work as expected anymore on 2.6.

        Attachments

          Issue Links

            Activity

              People

              Assignee:
              ramon.fernandez Ramon Fernandez Marina
              Reporter:
              mitar Mitar
              Participants:
              Votes:
              0 Vote for this issue
              Watchers:
              6 Start watching this issue

                Dates

                Created:
                Updated:
                Resolved: