我在一个集合中的MongoDB中有一个文档,该文档有一个字段x,该字段的值是一个嵌入式文档,创建方式如下:
> 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 } }注意,在嵌入的文档中有一个以美元($a)开头的字段和一个不以美元(b)开头的字段。我可以在没有dolar的情况下毫无问题地更新字段:
> 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 } }但是,如果我尝试以相同的方式更新以美元开头的字段,则会得到一个错误
> 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
}
})因此,如何在嵌入式文档中更新以美元开头的字段?
我使用的是MongoDB 4.4.1,以防你需要知道。
谢谢!
发布于 2021-04-28 23:49:58
无法更新以$开头字段,请参阅mongodb字段名称说明,
重要
对于字段名包含这些字符的文档,MongoDB查询语言并不总是有意义地表达查询(请参见SERVER-30575)。
在查询语言中添加支持之前,请使用$和。不推荐使用字段名称,官方的MongoDB驱动程序也不支持。
https://stackoverflow.com/questions/67303220
复制相似问题