Positional update operator updating wrong field

XMLWordPrintableJSON

    • Type: Bug
    • Resolution: Done
    • Priority: Major - P3
    • None
    • Affects Version/s: 3.2.6
    • Component/s: 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.
    • None
    • None
    • None
    • None
    • None
    • None
    • None

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

            Assignee:
            Unassigned
            Reporter:
            seba kerckhof
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: