Я использую Morphia для доступа к mongoDB. Мне нужно получить список объектов по длине внутреннего массива. Есть ли у кого-нибудь идеи, как это можно сделать, не передавая всю коллекцию на Java и не сортируя ее там?
Как я могу отсортировать результаты запроса MongoDB по размеру внутреннего массива?
Ответы (3)
Вы должны создать дополнительное поле с размером вложенного массива и использовать $ inc для обновить это поле.
Также вы можете использовать $ where, но очень медленно.
Вы выполняете поиск по длине вложенного массива следующим образом:
db.coll.find({ $where: "this.nestedArray.length > 3" });
Но, как я уже сказал, лучше создать дополнительное поле.
person
Andrew Orsich
schedule
23.04.2011
Спасибо, Эндрю, но я не это ищу. Я использую Morphia в качестве картографа POJO, поэтому не хочу добавлять ненужные поля. в любом случае все массивы javascript имеют свойство length. Мне интересно, есть ли способ использовать его в запросе.
- person tsinik; 24.04.2011
Нет, нет способа сделать это; нет ни поддержки сортировки по функциям, ни синтетического поля, определяющего длину массива. Это означает, что на данный момент вам нужно сохранить счетчик, если вы хотите встроить его и отсортировать по нему. Однако будьте осторожны при его обновлении.
- person Scott Hernandez; 24.04.2011
ОК, я нашел :-)
dataStore.find(MyClass.class).order("-inner_array.length").asList();
делает свое дело.
person
tsinik
schedule
24.04.2011
Я почти уверен, что этот запрос на самом деле не работает. Он может выполняться без ошибок, но когда я пробую что-то подобное в оболочке 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