我有一些文件,例如:
{
"_id" : 1,
"inner_array" : [
{
"object_value" : 1,
},
{
"object_value" : 2,
},
{
"object_value" : 1,
},
]
}
{
"_id" : 2,
"inner_array" : [
{
"object_value" : 1,
},
{
"object_value" : 1,
},
{
"object_value" : 1,
},
]
}
在第一个文档中,“inner_array”内有两个对象,其“object_value”为 1。现在我想按“inner_array”内“object_value”为 1 的对象总数对文档进行排序。上面的例子中,第一个文档的排序键是2,第二个文档的排序键是3。
我做了一些搜索,但仍然无法找到一种方法,而不是获取所有文档并编写代码进行过滤和排序。我如何在 native mongo 指令中执行此操作?
提前致谢!
最佳答案
您可以使用 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
) 开始运行查询,以便您可以看到每个阶段产生的结果。添加下一个阶段以查看它如何改变您的结果,然后添加下一个阶段,依此类推。
最后,此查询不考虑性能,因为它不属于此问题的直接范围。只需知道,如果您有一个大型数据集,那么您可以利用索引并修改聚合查询以使用这些索引。
关于MongoDB 按内部数组内指定对象的总和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32632974/