node.js - Mongodb合并更新子文档中的嵌套字段
问题描述
我正在搜索它是否存在,在 mongodb 或其 nodejs 驱动程序中,任何合并/更新子文档的方法,如下所示:
- 示例文档,例如在 collection 中
C
:
{
subdocument: {
a: 1,
b: 2
}
}
- 我不想使用的更新查询:
db.C.updateOne(
{},
{
$set: {
"subdocument.b": 3
}
}
}
- 我要使用的更新查询:
db.C.updateOne(
{},
{
$set: {
subdocument: {
b: 3
}
}
}
}
- 运行此类查询时得到的结果文档:
{
subdocument: {
b: 3
}
}
- 我想得到的结果合并文档:
{
subdocument: {
a: 1,
b: 3
}
}
为了记录,我想要这样做的原因是因为我试图使用接口来尽可能避免在字符串中编写模式关键字,所以我可以让打字稿编译器尽可能多地检查它们。所以我知道这样做的方法是更新“subdocument.b”,但我完全不想这样做,以避免使用字符串。
显然,子文档没有合并,而是使用标准更新无选项完全替换。我想知道是否有一种方法可以使用 mongodb 查询语言、聚合框架、mongodb nodejs 驱动程序或其他方式来本地执行此操作?从我自己可以学到的东西来看,它似乎不受支持,但也许是这样,有人可以告诉我怎么做吗?
谢谢
解决方案
如果您使用管道更新 MongoDB >= 4.2,这很容易做到。使用管道更新,所有聚合运算符都可以使用,但只有有限的阶段可以看到数据库命令,驱动程序在内部使用它。
如果您使用管道更新,则只能使用聚合运算符或查询运算符,$match
前提是您使用$expr
. 旧的更新运算符在管道内不起作用。
db.collection.update({},
[
{
"$addFields": {
"subdocument": {
"$mergeObjects": [
"$subdocument",
{
"b": 3
}
]
}
}
}
])
推荐阅读
- clojure - 2 个参数到一个参数函数中
- c# - EF 核心 | 需要使用 Navigation 属性来更新一个属性,而不是另一个(模块)
- .net - 使用 HttpContextAccessor 访问 dotnet 3.1 中的登录用户
- laravel - Laravel 帆不支持依赖错误
- android - Recyclerview 中的多个 ExoPlayer 视频播放器同时播放
- sql - Firebird按条件插入
- node.js - 如何显示来自heroku的图像和文件
- javascript - 使用 jQuery 创建列表项后如何修改它?
- css - 添加内容安全策略与折叠css
- excel - Excel - VBA - 添加公式的最佳方法