如何在MongoDB内部列表中插入一个元素?

bqujaahr  于 2022-11-03  发布在  Go
关注(0)|答案(2)|浏览(232)

我在MongoDB中存储了以下文档:

{
    name: 'myDoc',
    list: [
        {
            id:1
            items:[
                {id:1, name:'item1'},
                {id:2, name:'item2'}
            ]
        },
        {
            id:2
            items:[
                {id:1, name:'item1'},
                {id:3, name:'item3'}
            ]
        }
    ]
}

我找到了一种使用$addToSet将元素添加到“list”的方法,但我找不到一种将项目添加到特定的“items”列表的方法。
例如,我得到以下内容:

{id:5, name:'item5'}

我想把它添加到id为2的列表中的元素项中。

6ioyuze2

6ioyuze21#

一种方法是使用$push

db.col.update(
    { name: 'doc', 'list.id': 2 }, 
    {$push: {'list.$.items': {id: 5, name: 'item5'}}}
)

http://docs.mongodb.org/manual/reference/operator/push/
您也可以用其他运算符(如$addToSet)替换$push,以获得与您要查找的结果类似的结果。主要区别在于$push将把新元素附加到列表中,而$addToSet将在元素不存在时添加该元素(唯一的元素集)。

92dk7w1h

92dk7w1h2#

您可以使用此选项:-

> var toInsert = {id: 5, name: 'item6'}
> db.abc.update(
            { name: 'myDoc', list: { $elemMatch: { id: 2 } } },
            { $addToSet: { 'list.$.items': toInsert } }
  )

query部分将从list数组中查找包含id = 2的文档,然后使用$位置元素在该数组索引处添加一个新元素。
请参阅positional $ operator
您也可以将list: {$elemMatch: {id: 2}}仅替换为'list.id': 2
但是当你想根据数组中的多个元素进行更新时,使用$elemMatch会更好。例如,当你的匹配条件是id,而数组中的另一个字段是length时:-

list: {$elemMatch: {id: 2, length: 5}}

相关问题