Вернуть счетчик подколлекции с результатом в MongoDB и отсортировать по возрастанию
У меня возникли проблемы с получением подсчета подколлекции с сортировкой результата по счету в порядке возрастания.
вот как моя коллекция scripts
похоже:
{
"_id" : ObjectId("58bbf0a4b14e5fc44d5e9393"),
"label" : "Binarization",
"name" : "nlbin",
"require" : []
},
{
"_id" : ObjectId("58bbfb5eb14e5fc44d5e9c87"),
"label" : "Binarization",
"name" : "jpeg",
"require" : [ObjectId("58bbf0a4b14e5fc44d5e9393")]
},
{
"_id" : ObjectId("58bbfb4db14e5fc44d5e9c76"),
"label" : "Binarization",
"name" : "pseg",
"require" : [ObjectId("58bbf0a4b14e5fc44d5e9393"), ObjectId("58bbfb5eb14e5fc44d5e9c87")]
}
Так что проблема в том, что я хотел вернуть коллекции с количеством полей массива require
и сортируйте их в порядке возрастания. Запрос, который я написал, был примерно таким:
db.getCollection('scripts').aggregate({ $unwind: "$require" },{ $sortByCount:"$require" },{$sort: {count: 1}})
Проблема в том, что он не возвращает желаемый результат, а возвращает мне что-то вроде этого:
{
"_id" : ObjectId("58bbf0a4b14e5fc44d5e9393"),
"count" : 2
},
{
"_id" : ObjectId("58bbfb5eb14e5fc44d5e9c87"),
"count" : 1
}
что совершенно неправильно, как ObjectId("58bbf0a4b14e5fc44d5e9393")
должен иметь счет 0
, Также коллекция с самым большим count
(т.е. ObjectId("58bbfb4db14e5fc44d5e9c76")
) даже не включен в результат.
Конечный результат должен быть таким:
{
"_id" : ObjectId("58bbf0a4b14e5fc44d5e9393"),
"count" : 0
},
{
"_id" : ObjectId("58bbfb5eb14e5fc44d5e9c87"),
"count" : 1
},
{
"_id" : ObjectId("58bbfb4db14e5fc44d5e9c76"),
"count" : 2
}
Надеюсь, вы, ребята, поняли, что я имел в виду
1 ответ
Лучшее, что вы можете сделать, это добавить дополнительное поле (используя $addFields
) который держит require
размер массива без необходимости $unwind
а затем сортировать документы на основе этого поля, например,
db.getCollection('scripts').aggregate([
{ "$addFields": { "count": { "$size": "$require" } } },
{ "$sort": { "count": 1 } }
])