问题描述
我在 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,"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,如果你需要知道的话。
谢谢!
解决方法
不能更新以$
开头的字段,见mongodb字段名说明,
- 字段名称不能包含空字符。
- 顶级字段名称不能以美元符号 ($) 字符开头。 否则,从 MongoDB 3.6 开始,服务器允许存储包含点(即 .)和美元符号(即 $)的字段名称。
重要
MongoDB 查询语言无法始终对字段名称包含这些字符的文档进行有意义的查询(请参阅 SERVER-30575)。
在查询语言中添加支持之前,使用 $ 和 .不推荐使用 in 字段名称,官方 MongoDB 驱动程序不支持。