如何在 MongoDB 的嵌入文档中更新以美元开头的字段?

问题描述

我在 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字段名说明,

Restrictions on Field Names

  • 字段名称不能包含空字符。
  • 顶级字段名称不能以美元符号 ($) 字符开头。 否则,从 MongoDB 3.6 开始,服务器允许存储包含点(即 .)和美元符号(即 $)的字段名称。

重要

MongoDB 查询语言无法始终对字段名称包含这些字符的文档进行有意义的查询(请参阅 SERVER-30575)。

在查询语言中添加支持之前,使用 $ 和 .不推荐使用 in 字段名称,官方 MongoDB 驱动程序不支持。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...