2014-02-07 6 views
0

У меня есть документ, который представляет собой магазин с рекламой следующим образом:MongoDB - Вставить документ с _id в ребенок

{name: "name of store", 
address: "address of store", 
advertisements: [{title: "title of advertising", desc: "desc of advertising"}] 
} 

Для увеличения скорости чтения и вставить или найти рекламу из этого магазина легко, но, удалить конкретную рекламу, как я могу это сделать?

Есть способ добавить поле _id в элемент внутри массива объявлений? Таким образом, я мог найти конкретный элемент _id.

Мне не нравится подход, который использует $ elemMatch, чтобы найти элемент по вашему имени или другому полю, которое не является идентификатором _id.

Спасибо!

ответ

1

С встроенными документами нет полей _id, они являются собственностью основного документа в коллекции. Существует полные объяснения здесь: http://docs.mongodb.org/manual/core/document/

Любые встроенные документы или элементы массива или даже документы в массивах хранятся точно так, как есть, в естественном виде, как бы вы работать с JSON структурами или очень близко к большинству языка dynaminc нативные представления.

В вашем случае для документов внутри массива вы можете либо использовать оператор запроса $elemMatch, чтобы найти документ (ы), который хотите удалить.

{ name: "<matching name>", advertisements: { $elemMatch: { title: 'title of advertising' } } } 

В качестве альтернативы существует точка обозначения подход:

{ name: "<matching name>", advertisements.title = 'title of advertising' } 

Или даже индекс обозначения:

{ name: "<matching name>", advertisements[0] } 

Во всяком случае, есть коллекция Array operators для использования в обновлениях, так что вы можете манипулировать элементами.

Возможно, ваша настоящая проблема здесь не с $elemMatch, а со структурой документов, содержащихся без уникального ключа, в котором к ним доступ. В таком случае, возможно, вам стоит подумать об изменении структуры поддокументов в ваших данных, чтобы иметь разумный идентификатор для поиска документов. Это, как правило, подход, основанный на передовой практике.

+0

Да, я согласен с вами. Но, моя проблема в том, что мне нужно найти только некоторые магазины, не все. Итак, если у меня есть две отдельные коллекции (магазины и рекламные объявления), мне нужно: 1) получить все магазины по моим критериям. 2) Для каждого магазина, получите все рекламные объявления из этого магазина. Так что, если бы у меня было 100 магазинов, и у каждого магазина было 10 рекламных объявлений, будет ста запросов на сбор рекламы! Плюс цикл для итерации! Вот почему я предпочитаю иметь только одну коллекцию. – vitorvigano

+0

Не следует вашей логике. Вы должны иметь возможность запрашивать критерии соответствия «хранилище соответствия» и «соответствия рекламы» в одной операции поиска. Возможно, вам следует расширить свой вопрос, чтобы показать небольшой образец документов с критериями, которые вы пытаетесь сопоставить, а не просто показывать их. Вы просто не указали в комментариях, о которых вы просите. –

Смежные вопросы