我有一些文件,如:
{
"_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。
我做了一些搜索,但仍然无法找到方法,而不是获取所有文档并编写代码进行过滤和排序。我如何在本地mongo指令中执行此操作?
提前致谢!
答案 0 :(得分:2)
您可以使用MongoDB的Aggregation框架来获取您指定的查询结果。
聚合框架允许您将处理分解为一个或多个阶段,其中每个阶段执行一些基本工作,例如过滤,分组,转换特定阶段的结果。 aggregation stage operators支持此处理。
因此,处理查询的一种方法是使用聚合并建立以下阶段:
inner_array
数组。这样便于计算等于inner_array.object_value
的{{1}}。 Group您的结果,以便我们得到每个文档1
的总计数。
在inner_array.object = 1
计算中,totalCount
仅适用于值$sum
的{{1}}元素。
同样在分组中,我将inner_array.object_value
添加回舞台结果,因为我假设您要查看最终结果集中的所有文档元素。
Sort阶段按1
升序排列(使用inner_array
降序排序)。
Project结果消除了最终结果中的totalCount
字段。
如果您的集合被称为-1
,那么这就是您的聚合查询的外观,如上述步骤所述。
totalCount
我建议您仅从第一阶段开始运行查询(yourcollection
),以便您可以看到每个阶段产生的内容。添加下一个阶段,看看它如何改变你的结果,然后是下一个等等。
最后,此查询不考虑性能,因为它不在此问题的直接范围内。只要知道如果你有一个大型数据集,那么你可以利用索引并修改你的聚合查询来使用这些索引。