首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在mongodb中更新嵌套数组

在mongodb中更新嵌套数组
EN

Stack Overflow用户
提问于 2010-11-08 14:15:36
回答 5查看 28K关注 0票数 49

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

代码语言:javascript
运行
复制
{
    id: 1,
    items: [
        {
            id: 2,
            blocks: [
                {
                    id: 3
                    txt: 'hello'
                }
            ]
        }
    ] 
}

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

代码语言:javascript
运行
复制
db.objects.update({'items.id': 2}, {'$set': {'items.$.blocks.0.txt': 'hi'}})

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

有没有其他方法可以更新这样的嵌套对象,我可以引用对象的ID而不是它的位置,或者在查询中使用它之前检查提供的索引是否越界?

EN

回答 5

Stack Overflow用户

发布于 2010-11-09 23:58:24

这里有一个大问题,你需要利用Mongo的"addToSet“和"push”操作吗?如果您确实计划只修改数组中的单个项,那么您可能应该将这些数组构建为对象。

下面是我的结构:

代码语言:javascript
运行
复制
{
    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", } }, { multi: false, arrayFilters: [ { 'itm.id': 2 }, { 'blk.id': 3} ] } )

票数 29
EN

Stack Overflow用户

发布于 2012-05-08 10:27:52

您使用的it是线性数,它必须来自某个地方,例如'max_idx‘或类似的附加字段。这意味着对id进行一次查找,然后进行更新。UUID/ObjectId可以用于ids,这将确保您也可以使用分布式CRUD。

票数 3
EN

Stack Overflow用户

发布于 2020-09-25 12:43:41

MongoDB 3.6添加了all positional operator $[],因此如果您知道需要更新的块的id,您可以执行以下操作:

代码语言:javascript
运行
复制
db.objects.update({'items.blocks.id': id_here}, {'$set': {'items.$[].blocks.$.txt': 'hi'}})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4121666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档