У меня есть схема документа в MongoDB, который выглядит следующим образом:Обновление несколько Вложенного массива в MongoDB
{
_id: 1
tags: [{
tag: 'foo'
links: [{
link: 'http:www.google.com'
date: '123'
}]
}]
}
Я пытаюсь нажать ссылку в массив «ссылка», который будет уникальным для документа.
Мой первый запрос ...
db.userlinks.update (
{_id: 1, tags: {$nin: [{tag:'foo'}]}},
{$push: {'tags': {tag:'foo'}}},
{upsert: true}
)
дает мне это (создает тег, если он не существует)
{ "_id" : 1, "tags" : [ { "tag" : "foo" } ] }
Я тогда следует, что с этим запросом ...
db.userlinks.update (
{_id: 1, tags: {tag: 'foo', links: {$nin: [{link: 'http://www.google.com'}]}}},
{$push: {tags: {tag: 'foo', links: {link: 'http://www.google.com', date: '123'}}}},
{upsert: true}
)
Но я получаю эту ошибку: «Невозможно применить $ пуш/модификатор $ pushAll, не включенным в массив»
Я уверен, что проблема заключается в компоненте «обновления» моего второго запроса, но я не уверен, как его исправить. Любая помощь будет оценена по достоинству.
EDIT
Мой первый запрос теперь ... (спасибо Джо)
db.userlinks.update (
{_id: 1, tags: {$nin: [{tag:'foo'}]}},
{$push: {'tags': {tag:'foo', links:[]}}},
{upsert: true}
)
Мой второй запрос теперь ...
db.userlinks.update (
{_id: 1, 'tags.tag': 'foo'},
{$push: {'tags.$.links': {link: 'http://www.google.com', date: '123'} } }
)
успешно проталкивает ссылку в массив 'links', однако он также позволяет дублировать. Я не могу разрешить дублирование ссылок. $ addToSet, но если дата изменяется, то она по-прежнему вставляет дублируемую ссылку.
Есть ли способ проверить наличие ссылки в разделе «запрос» моего второго запроса или вместо этого только addToSet, если определенные поля совпадают?
вы не можете. рассмотреть возможность изменения вашей схемы? –
Я не особо хочу изменить свою схему, потому что она смоделирована именно так, как она выводится, что означает, что мне не нужно делать какие-либо перетаскивания данных, как только я выберу это из db. Я думал, что это была основная причина для использования Мондума. Возможность моделирования ваших объектов непосредственно в базу данных и из нее. – 2013-04-15 03:48:50