- 
    Type:Improvement 
- 
    Resolution: Unresolved
- 
    Priority:Major - P3 
- 
    None
- 
    Affects Version/s: 4.0.6
- 
    Component/s: None
- 
    None
- 
        Query Optimization
- 
        v4.0, v3.6
- 
        Query 2019-04-22
- 
        None
- 
        None
- 
        None
- 
        None
- 
        None
- 
        None
- 
        None
With MongoDB 3.6, dollar-prefixed fields were allowed. Invoking ReplaceOne on such a document, however, results in an error:
rs0:PRIMARY> db.coll.insertOne({"a": {"$foo": 1}})
{
        "acknowledged" : true,
        "insertedId" : ObjectId("5c86835900b48b0b86ee197d")
}
rs0:PRIMARY> doc = db.coll.findOne()
{ "_id" : ObjectId("5c86835900b48b0b86ee197d"), "a" : { "$foo" : 1 } }
rs0:PRIMARY> doc
{ "_id" : ObjectId("5c86835900b48b0b86ee197d"), "a" : { "$foo" : 1 } }
rs0:PRIMARY> doc['b'] = 2
2
rs0:PRIMARY> db.coll.replaceOne({}, doc)
2019-03-11T11:49:14.749-0400 E QUERY    [js] WriteError: The dollar ($) prefixed field '$foo' in 'a.$foo' is not valid for storage. :
WriteError({
        "index" : 0,
        "code" : 52,
        "errmsg" : "The dollar ($) prefixed field '$foo' in 'a.$foo' is not valid for storage.",
        "op" : {
                "q" : {                },
                "u" : {
                        "_id" : ObjectId("5c86835900b48b0b86ee197d"),
                        "a" : {
                                "$foo" : 1
                        },
                        "b" : 2
                },
                "multi" : false,
                "upsert" : false
        }
})
WriteError@src/mongo/shell/bulk_api.js:461:48
Bulk/mergeBatchResults@src/mongo/shell/bulk_api.js:841:49
Bulk/executeBatch@src/mongo/shell/bulk_api.js:906:13
Bulk/this.execute@src/mongo/shell/bulk_api.js:1150:21
DBCollection.prototype.replaceOne@src/mongo/shell/crud_api.js:489:17
@(shell):1:1
This happened on MongoDB 4.0.5, but probably happens on all versions. This smells of a validation that should have been removed in 3.6 when these field names were allowed.
I can't think of any reason that documents valid for insertOne wouldn't be valid for replaceOne.
- is duplicated by
- 
                    SERVER-56462 Field starting with dollar in an embedded document cannot be updated with $set -         
- Closed
 
-