Mongo DB: как выбрать элементы с количеством вложенных массивов> 0

база данных около 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#?

ТИА

С. П. возле я нашел: "Добавить новое поле в Ханде размер категории. Это обычная практика в мире монго." это правда?

6 ответов


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

db.collection.find({$where: '(this.hobbies.length > 0)'})

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

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

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


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

db.collection.find({array: {$not: {$size: 0}}})

это несколько верно.

согласно руководству

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

$size

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

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

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

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


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

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


  1. Если вам нужно найти только ноль хобби , и если ключ хобби не установлен для кого-то с нулевым хобби, используйте флаг существует. Добавьте индекс "хобби" для повышения производительности:

    db.коллекция.найти ({ hobbies : { $exists: true } });

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

поддерживайте переменную под названием "hcount" (hobby count) и всегда устанавливайте ее равной размеру массива hobbies в любом обновлении. Индекс по полю " hcount" Затем вы можете выполнить запрос типа:

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

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