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

Positional update operator updating wrong field

    XMLWordPrintableJSON

Details

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Major - P3 Major - P3
    • None
    • 3.2.6
    • Querying
    • None
    • ALL
    • Hide

      Step 1. Make a collection called 'locations'
      Step 2. Insert this document in the locations collection:

      {
          "_id" : "XqEQYpitGFG3nnf3C",
          "wallpapers" : [ 
              {
                  "_metadata" : {
                      "master" : "vwb22W4MhkqtvAp89",
                      "isMaster" : false
                  },
                  "role" : "master",
                  "_id" : ""
              }, 
              {
                  "_metadata" : {
                      "master" : "vwb22W4MhkqtvAp89",
                      "isMaster" : false
                  },
                  "role" : "clone",
                  "_id" : ""
              }, 
              {
                  "_metadata" : {
                      "master" : "vwb22W4MhkqtvAp89",
                      "isMaster" : false
                  },
                  "role" : "pod",
                  "_id" : ""
              }
          ],
          "ancestors" : [ 
              "vwb22W4MhkqtvAp89", 
              "tqzqfum9uMs47xcHW", 
              "b4d83aqTkq6TGvXts", 
              "XqEQYpitGFG3nnf3C"
          ]
      

      Step 3. Run this query:

      b.getCollection('locations').update(
          {
              "ancestors": "b4d83aqTkq6TGvXts",
              "wallpapers": {
                  "$elemMatch": {
                      "role": "clone",
                      "_metadata.master": "vwb22W4MhkqtvAp89"
                  }
              }
          },
          {
              "$set": {
                  "wallpapers.$": {
                      "_id": "D33WNZh7Bg4itPdhk",
                      "_metadata": {
                          "master": "b4d83aqTkq6TGvXts",
                          "isMaster": false
                      },
                      "role": "clone"
                  }
              }
          }
      )
      

      Step 4
      Document is now:

      {
          "_id" : "XqEQYpitGFG3nnf3C",
          "wallpapers" : [ 
              {
                  "_metadata" : {
                      "master" : "vwb22W4MhkqtvAp89",
                      "isMaster" : false
                  },
                  "role" : "master",
                  "_id" : ""
              }, 
              {
                  "_metadata" : {
                      "master" : "vwb22W4MhkqtvAp89",
                      "isMaster" : false
                  },
                  "role" : "clone",
                  "_id" : ""
              }, 
              {
                  "_id" : "D33WNZh7Bg4itPdhk",
                  "_metadata" : {
                      "master" : "b4d83aqTkq6TGvXts",
                      "isMaster" : false
                  },
                  "role" : "clone"
              }
          ],
          "ancestors" : [ 
              "vwb22W4MhkqtvAp89", 
              "tqzqfum9uMs47xcHW", 
              "b4d83aqTkq6TGvXts", 
              "XqEQYpitGFG3nnf3C"
          ]
      }
      

      So the `$` operator uses the index of the `ancestor` part of the update operation query, instead of the `wallpapers` one.

      Show
      Step 1. Make a collection called 'locations' Step 2. Insert this document in the locations collection: { "_id" : "XqEQYpitGFG3nnf3C", "wallpapers" : [ { "_metadata" : { "master" : "vwb22W4MhkqtvAp89", "isMaster" : false }, "role" : "master", "_id" : "" }, { "_metadata" : { "master" : "vwb22W4MhkqtvAp89", "isMaster" : false }, "role" : "clone", "_id" : "" }, { "_metadata" : { "master" : "vwb22W4MhkqtvAp89", "isMaster" : false }, "role" : "pod", "_id" : "" } ], "ancestors" : [ "vwb22W4MhkqtvAp89", "tqzqfum9uMs47xcHW", "b4d83aqTkq6TGvXts", "XqEQYpitGFG3nnf3C" ] Step 3. Run this query: b.getCollection( 'locations' ).update( { "ancestors" : "b4d83aqTkq6TGvXts" , "wallpapers" : { "$elemMatch" : { "role" : "clone" , "_metadata.master" : "vwb22W4MhkqtvAp89" } } }, { "$set" : { "wallpapers.$" : { "_id" : "D33WNZh7Bg4itPdhk" , "_metadata" : { "master" : "b4d83aqTkq6TGvXts" , "isMaster" : false }, "role" : "clone" } } } ) Step 4 Document is now: { "_id" : "XqEQYpitGFG3nnf3C", "wallpapers" : [ { "_metadata" : { "master" : "vwb22W4MhkqtvAp89", "isMaster" : false }, "role" : "master", "_id" : "" }, { "_metadata" : { "master" : "vwb22W4MhkqtvAp89", "isMaster" : false }, "role" : "clone", "_id" : "" }, { "_id" : "D33WNZh7Bg4itPdhk", "_metadata" : { "master" : "b4d83aqTkq6TGvXts", "isMaster" : false }, "role" : "clone" } ], "ancestors" : [ "vwb22W4MhkqtvAp89", "tqzqfum9uMs47xcHW", "b4d83aqTkq6TGvXts", "XqEQYpitGFG3nnf3C" ] } So the `$` operator uses the index of the `ancestor` part of the update operation query, instead of the `wallpapers` one.

    Description

      If my update operation query tries to match more than one array field, then the `$` update operator doesn't indicate the correct field.

      Attachments

        Activity

          People

            Unassigned Unassigned
            seba.kerckhof@gmail.com seba kerckhof
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: