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

Field starting with dollar in an embedded document cannot be updated with $set

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major - P3
    • Resolution: Duplicate
    • Affects Version/s: 4.4.1
    • Fix Version/s: None
    • Component/s: None
    • Labels:
      None
    • Operating System:
      ALL

      Description

      I have a document in MongoDB (version 4.4.1) in a collection with a document which has a field `x` which value is an embedded document, created this way:

      > db.c.insert({_id: 1, x: {$a: 2, b: 3}})
      WriteResult({ "nInserted" : 1 })
      > db.c.findOne({_id: 1})
      { "_id" : 1, "x" : { "$a" : 2, "b" : 3 } } 

      Note there is a field in the embedded document which starts with dollar (`$a`) and a field that doesn't start with dollar (`b`). I can update the field without dolar without problem:

      > db.c.updateOne({_id: 1}, {$set: {"x.b": 30}})
      { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
      > db.c.findOne({_id: 1})
      { "_id" : 1, "x" : { "$a" : 2, "b" : 30 } } 

      However, if I try to update the field which starts with dollar in the same way, I get an error

      > db.c.updateOne({_id: 1}, {$set: {"x.$a": 20}})
      WriteError({
          "index" : 0,
          "code" : 52,
          "errmsg" : "The dollar ($) prefixed field '$a' in 'x.$a' is not valid for storage.",
          "op" : {
              "q" : {
                  "_id" : 1
              },
              "u" : {
                  "$set" : {
                      "x.$a" : 20
                  }
              },
              "multi" : false,
              "upsert" : false
          }
      })

      I know the recomendation in MongoDB documentation https://docs.mongodb.com/manual/reference/limits/#mongodb-limit-Restrictions-on-Field-Names which says:

      The MongoDB Query Language cannot always meaningfully express queries over documents whose field names contain these characters  [$ or .]... Until support is added in the query language, the use of $ and . in field names is not recommended and is not supported by the official MongoDB drivers.

      However, note this case the problem is not in the query part but in the update part, so my understanding is that that recommendation doesn't apply. Moreover, if I do a query like

      db.c.find({"x.$a": 2}) 

      it works.

        Attachments

          Issue Links

            Activity

              People

              Assignee:
              edwin.zhou Edwin Zhou
              Reporter:
              fermin.galanmarquez@telefonica.com Fermín Galán
              Participants:
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

                Dates

                Created:
                Updated:
                Resolved: