Как я могу отсортировать результаты запроса MongoDB по размеру внутреннего массива?

Я использую Morphia для доступа к mongoDB. Мне нужно получить список объектов по длине внутреннего массива. Есть ли у кого-нибудь идеи, как это можно сделать, не передавая всю коллекцию на Java и не сортируя ее там?


person tsinik    schedule 23.04.2011    source источник


Ответы (3)


Вы должны создать дополнительное поле с размером вложенного массива и использовать $ inc для обновить это поле.

Также вы можете использовать $ where, но очень медленно.

Вы выполняете поиск по длине вложенного массива следующим образом:

db.coll.find({ $where: "this.nestedArray.length > 3" });

Но, как я уже сказал, лучше создать дополнительное поле.

person Andrew Orsich    schedule 23.04.2011
comment
Спасибо, Эндрю, но я не это ищу. Я использую Morphia в качестве картографа POJO, поэтому не хочу добавлять ненужные поля. в любом случае все массивы javascript имеют свойство length. Мне интересно, есть ли способ использовать его в запросе. - person tsinik; 24.04.2011
comment
Нет, нет способа сделать это; нет ни поддержки сортировки по функциям, ни синтетического поля, определяющего длину массива. Это означает, что на данный момент вам нужно сохранить счетчик, если вы хотите встроить его и отсортировать по нему. Однако будьте осторожны при его обновлении. - person Scott Hernandez; 24.04.2011

ОК, я нашел :-)

dataStore.find(MyClass.class).order("-inner_array.length").asList();
делает свое дело.

person tsinik    schedule 24.04.2011
comment
Я почти уверен, что этот запрос на самом деле не работает. Он может выполняться без ошибок, но когда я пробую что-то подобное в оболочке mongo, на самом деле ничего не сортируется. - person AlbertEngelB; 09.04.2014

Например:

исходные данные tmb_results_by_tissue_other:

{"base_info":[1,2,3],"type":"123"},
{"base_info":[2,3,4,5],"type":"123"},

по совокупности

db.tmb_results_by_tissue_other.aggregate([{$project:{"type":1, num:{$size:"$base_info"}}},{$sort:{"num":-1}}])
person shou    schedule 16.08.2017