2014-12-15 2 views
0

В MongoDB, предположим, что у нас есть коллекция items со следующими данными выборки:Находить документы, имеющие специфические значения в поддокументами в MongoDB

[ 
    {name: "A", locations: [{country: "USA"}, {country: "Germany"}]}, 
    {name: "B", locations: [{country: "USA"}], 
    {name: "C", locations: [{country: "France"}, {country: "Germany"}]}, 
    {name: "D", locations: [{country: "Germany"}]}, 
    {name: "E", locations: [{country: "USA"}, {country: "UK"}]} 
] 
  1. Как мы можем получить name поле всех документов Имея только country: "Germany" в locations вложенный документ?

    Пример: Используя сбор образцов items выше, то выполнение выше запрос должен возвращать [{name: "D"}]

  2. Как мы можем получить name поле всех документов с locations поддокумент не имеющие country: France или country: "Germany" (или оба) как элемент?

    Пример: Используя сбор образцов items выше, то выполнение выше запрос должен возвращать [{name: "B"}, {name: "E"}]

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

Примечание: Документы/запросы - это только образцы, а документы/запросы, с которыми я имею дело, различны.

+1

1-db.test.find ({ "места": [{ "страна": "Германия"}]}) – Disposer

+0

Это будет работать, только если мы предположим, что «местоположения» будут содержать только один ключ/значение «страна:« Германия ». Если есть другие пары ключ/значение, это не сработает. – tria

ответ

1

Как мы можем получить поле имени всех документов, имеющих только страну: «Германия» в поддокументах местоположений?

Оператор $size пригодится для этого:

db.foo.find({locations:{$size:1}, "locations.country":"Germany"}) 

Как мы можем получить имя поля всех документов с места поддокументе не имея страна: Франция или страна: " Германия "(или оба) в качестве элемента?

Оператор $nin пригодится для этого:

db.foo.find({"locations.country":{$nin:["Germany", "France"]}}) 
+0

Отличный ответ. Предполагаю ли я, что если я хочу получить только документы, имеющие ровно оба местоположения «Германия» и «Франция», тогда я бы сделал: 'db.items.find ({location: {$ size: 2}," locations.country ": {$ в: [ "Германия", "Франция"]}}) '? – tria

+1

В этом случае вы хотите использовать оператор ['all all '] (http://docs.mongodb.org/manual/reference/operator/query/all/) для соответствия ** всех ** элементы в данном массиве: 'db.items.find ({location: {$ size: 2}," locations.country ": {$ all: [" Германия "," Франция "]}})' –

+0

Спасибо за ваш Помогите Ананду. – tria

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