如何将元素插入MongoDB内部列表?

时间:2012-12-21 09:22:56

标签: mongodb mongodb-query

我在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'添加元素的方法,但我找不到添加到项目的“项目”列表的方法。

e.g。 我得到以下内容:

{id:5, name:'item5'} 

我希望将它添加到列表中元素的项目,ID为:

2 个答案:

答案 0 :(得分:47)

这样做的一种方法是使用$push

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

http://docs.mongodb.org/manual/reference/operator/push/

您还可以将$push替换为其他运算符(可能)$addToSet,以获得您要查找的确切结果。

答案 1 :(得分:13)

您可以使用: -

> 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}}