我有一些文件,比如:
{
"_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,
},
]
}
在第一个文档中,“内部数组”中有两个对象的“对象值”为1。现在我想按“inner_array”中“object_value”为1的对象总数对文档进行排序。如上所示,第一个文档的排序键是2,第二个文档的排序键是3。
我做了一些搜索,但仍然找不到一种方法,而不是得到所有的文档,并编写代码来过滤和排序。如何在本地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
添加回stage results,因为我假设您希望看到最终结果集中的所有文档元素。
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 - MongoDB按内部数组内指定对象的总和排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32632974/