56

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

例如,我得到以下信息:

{id:5, name:'item5'} 

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

4

2 回答 2

60

一种方法是使用$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以获得您正在寻找的确切结果。

于 2012-12-21T09:30:00.640 回答
18

你可以使用这个: -

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

该部件将使用 . 从数组中query找到文档。然后我们使用位置元素在该数组索引处添加一个新元素。listid = 2$

positional $ operator


您也可以替换list: {$elemMatch: {id: 2}}为 just 'list.id': 2

但是$elemMatch,当您想根据数组的多个元素进行更新时,使用会更好。例如,当您的匹配条件是id数组中的另一个字段时说length:-

list: {$elemMatch: {id: 2, length: 5}}
于 2012-12-21T09:30:39.407 回答