Mongo DB: как выбрать элементы с количеством вложенных массивов> 0 - PullRequest
7 голосов
/ 26 сентября 2011

База данных около 5 ГБ. У меня есть документы, такие как:

{
    _id: ..
    user: "a"
    hobbies: [{
        _id: ..
        name: football
    },
    {
        _id: ..
        name: beer
    }
    ...
    ]
}

Я хочу вернуть пользователей, у которых более 0 "хобби" Я пробовал

db.collection.find({"hobbies" : { &gt : 0}}).limit(10)

и он занимает всю оперативную память, но без результата.

  1. Как сделать этот выбор?
  2. А как вернуть только: id, name, count?
  3. Как это сделать с официальным драйвером c #?

ТИА

P.S. около я нашел: «Добавьте новое поле к размеру категории Ханде. Это обычная практика в мире монго». это правда?

Ответы [ 6 ]

16 голосов
/ 24 августа 2013

В этом конкретном случае вы можете использовать индексирование списка для решения вашей проблемы:

db.collection.find({"hobbies.0" : {$exists : true}}).limit(10)

Это просто гарантирует, что 0-й элемент существует. Вы можете сделать то же самое, чтобы убедиться, что список короче, чем n или имеет длину от x до y, проверив наличие элементов в конце диапазона.

8 голосов
/ 26 сентября 2011

Вы пытались использовать hobbies.length. я не проверял это, но я считаю, что это правильный способ запросить диапазон массива в mongodb

db.collection.find({$where: '(this.hobbies.length > 0)'})
7 голосов
/ 12 мая 2014

Вы можете (вроде) проверять диапазон длин массива с помощью оператора $size, используя логический $not:

db.collection.find({array: {$not: {$size: 0}}})
2 голосов
/ 26 сентября 2011

Это в некоторой степени верно.

В соответствии с руководством

http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24size

$ size

Оператор $ size соответствует любому массивус указанным количеством элементов.Следующий пример будет соответствовать объекту {a: ["foo"]}, так как этот массив имеет только один элемент:

db.things.find( { a : { $size: 1 } } );

Вы не можете использовать $ size, чтобы найтидиапазон размеров (например: массивы с более чем 1 элементом).Если вам нужно запросить диапазон, создайте поле дополнительного размера, которое вы увеличиваете при добавлении элементов

Таким образом, вы можете проверить размер массива 0, но не такие вещи, как «больше чем»0'

1 голос
/ 26 сентября 2011

Предыдущие вопросы объясняют, как решить проблему с количеством массивов.Хотя в вашем случае, если ZERO действительно является единственным значением, которое вы хотите проверить, вы можете установить массив в null, когда он пуст, и установить опцию не сериализовать его, тогда вы можете проверить существование этого поля.Не забудьте проверить на нулевое значение и создать массив, когда вы хотите добавить хобби для пользователя.

Для # 2, при условии, что вы добавили поле подсчета, легко выбрать нужные поля из базы данных ивключить поле подсчета.

0 голосов
/ 26 сентября 2011
  1. , если вам нужно найти только ноль хобби, и если ключ хобби не задан для человека с нулевым хобби, используйте флаг EXISTS.Добавьте индекс «хобби» для повышения производительности:

    db.collection.find ({hobbies: {$ exist: true}});

  2. Однако, если человек с нулевым хобби имеет пустой массив, а человек с 1 хобби имеет массив с 1 элементом, используйте это общее решение:

Поддерживайте переменную hcount (количество хобби) и всегда устанавливайте ее равной размеру массива хобби при любом обновлении.Индекс в поле «hcount» Затем вы можете выполнить запрос, например:

 db.collection.find( { hcount : 0 } ) // people with 0 hobbies    
 db.collection.find( { hcount : 5 } ) // people with 5 hobbies

3 - из ответа @JohnPs «$ size» также является хорошим оператором для этой цели.http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24size

...