Подтвердить что ты не робот

Как вставить элемент в внутренний список MongoDB?

У меня есть следующий документ, хранящийся в 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.

4b9b3361

Ответ 1

Один из способов сделать это будет с $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, чтобы получить точные результаты, которые вы ищете.

Ответ 2

Вы можете использовать это: -

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

Часть query найдет документ из массива list с id = 2. Затем мы используем элемент $ positional для добавления нового элемента в этот индекс массива.

См. positional $ operator


Вы также можете заменить list: {$elemMatch: {id: 2}} на 'list.id': 2.

Но использование $elemMatch будет лучше, если вы хотите обновить на основе нескольких элементов вашего массива. Например, когда ваши критерии соответствия id, а другое поле в массиве говорит length: -

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