Вы можете использовать инфраструктуру MongoDB Aggregation, чтобы получить результаты запроса, которые вы указали.
Структура агрегации позволяет разбивать вашу обработку на один или несколько этапов, где каждый этап выполняет некоторые основные работы, такие как фильтрация, группировка, преобразование результатов на определенном этапе. aggregation stage operators поддерживают эту обработку.
В результате один способ приблизиться ваш запрос с помощью агрегации и создания следующих этапов:
- Unwind ваш
inner_array
массив. Это облегчит возможность подсчета inner_array.object_value
, равного 1
.
Group Ваши результаты, чтобы мы получили общее количество inner_array.object = 1
за документ.
При расчете totalCount
, то $sum
имеет место только для inner_array.object_value
элементов, которые имеют значение 1
.
Также в группе я добавляю inner_array
к результатам этапа, так как я предполагаю, что вы хотите видеть все элементы документа в конечном наборе результатов.
Sort результаты этапа по totalCount
в порядке возрастания (использование для -1
порядке убывания).
Project Результаты, удаляющие поле totalCount
из ваших окончательных результатов.
Если ваша коллекция называется yourcollection
то это то, что ваш агрегация запрос будет выглядеть так, как описано в предыдущих шагах.
db.yourcollection.aggregate([
{ "$unwind" : "$inner_array" },
{ "$group" : {
"_id" : "$_id",
"totalCount" : {
"$sum" : {
"$cond" : {
"if" : { "$eq" : [ "$inner_array.object_value", 1 ] },
"then" : 1,
"else" : 0
}
}
},
"inner_array" : {
"$push" : {
"object_value" : "$inner_array.object_value"
}
}
}},
{ "$sort" : { "totalCount" : 1 } },
{ "$project" : {
"inner_array" : 1
}}
])
Я полагаю, что при выполнении запроса, начиная с первым этапом только ($unwind
), так что вы можете увидеть, что производит каждый этап. Добавьте следующий этап, чтобы увидеть, как он изменяет ваши результаты, а затем следующий и т. Д.
Наконец, этот запрос не учитывает производительность, поскольку он не находится в непосредственной близости от этого вопроса. Просто знайте, что если у вас большой набор данных, вы можете воспользоваться индексами и изменить свой запрос на агрегацию, чтобы использовать эти индексы.
Благодарим за ответ и большое предложение! После того, как я построю этап '$ unwind', я могу видеть, что у меня есть, и построить другие этапы самостоятельно. Поэтому, наконец, я получаю следующее: 'db.mycollection.aggregate ([ {$ unwind: '$ inner_array'}, {$ match: {'inner_array.object_value': 1}}, {$ group: {_id: '$ _id', totalCount: {$ sum: 1}}}, {$ sort: {totalCount: 1}} ]) ' –
@KevinXi Я рад, что мое предложение помогло. Ваш обновленный агрегированный запрос является идеальным. – whyceewhite