arrays - 更新 mongodb 中的嵌套数组

标签 arrays mongodb nested

我在 mongodb 中有一个文档,其中包含需要更新的 2 级深度嵌套对象数组,如下所示:

{
    id: 1,
    items: [
        {
            id: 2,
            blocks: [
                {
                    id: 3
                    txt: 'hello'
                }
            ]
        }
    ] 
}

如果只有一级深度数组,我可以使用位置运算符更新其中的对象,但对于第二级,我想出的唯一选择是使用位置运算符和嵌套对象的索引,如下所示:

db.objects.update({'items.id': 2}, {'$set': {'items.$.blocks.0.txt': 'hi'}})

这种方法有效,但对我来说似乎很危险,因为我正在构建一个 Web 服务,并且索引号应该来自客户端,它可以发送 100000 作为索引,这将迫使 mongodb 创建一个包含 100000 个索引且值为空的数组。

是否有任何其他方法可以更新此类嵌套对象,我可以在其中引用对象的 ID 而不是它的位置,或者在查询中使用它之前检查提供的索引是否超出范围?

最佳答案

这是一个大问题,您是否需要利用 Mongo 的“addToSet”和“push”操作?如果您真的打算只修改数组中的单个项目,那么您可能应该将这些数组构建为对象。

这是我的结构:

{
    id: 1,
    items: 
        { 
          "2" : { "blocks" : { "3" : { txt : 'hello' } } },
          "5" : { "blocks" : { "1" : { txt : 'foo'}, "2" : { txt : 'bar'} } }
        }
}

这基本上将所有内容转换为 JSON 对象而不是数组。你失去了使用 $push$addToSet 的能力,但我认为这让一切变得更容易。例如,您的查询将如下所示:

db.objects.update({'items.2': {$exists:true} }, {'$set': {'items.2.blocks.0.txt': 'hi'} })

您还会注意到我已经转储了“ID”。当您嵌套这样的东西时,您通常可以简单地使用该数字作为索引来替换“ID”。现在隐含了“ID”概念。

此功能已在 3.6 中添加到 expressive updates .

db.objects.update( {id: 1 }, { $set: { 'items.$[itm].blocks.$[blk].txt': "hi", } }, { 多: false, arrayFilters: [ { 'itm.id': 2 }, { 'blk.id': 3} ] } )

关于arrays - 更新 mongodb 中的嵌套数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4121666/

相关文章:

mongodb - 如何使用 mgo 包在 go 中编写 $subtract mongo 查询?

php - 在各自的列中显示嵌套的数组键值php html

dart - flutter 中的嵌套 ListViews 给出水平视口(viewport)错误

string - 嵌套引号 bash

arrays - 在对象数组中找到最近的项目?

JavaScript 将数组与数组对象进行比较以查看它们的值是否匹配

node.js - 将 Mongoose 模型包含到包含在 node.js 文件中的单个 js 中?

javascript - mongodb 和 mongomapper

c++ - 错误 : cannot specify explicit initializer for array

java - 要求用户输入数组中的项目数量