MongoDB按内部数组内指定对象的总和排序

时间:2015-09-17 14:32:15

标签: mongodb sorting

我有一些文件,如:

{ 
    "_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指令中执行此操作?

提前致谢!

1 个答案:

答案 0 :(得分:2)

您可以使用MongoDB的Aggregation框架来获取您指定的查询结果。

聚合框架允许您将处理分解为一个或多个阶段,其中每个阶段执行一些基本工作,例如过滤,分组,转换特定阶段的结果。 aggregation stage operators支持此处理。

因此,处理查询的一种方法是使用聚合并建立以下阶段:

  1. Unwind您的inner_array数组。这样便于计算等于inner_array.object_value的{​​{1}}。
  2. Group您的结果,以便我们得到每个文档1的总计数。

    inner_array.object = 1计算中,totalCount仅适用于值$sum的{​​{1}}元素。

    同样在分组中,我将inner_array.object_value添加回舞台结果,因为我假设您要查看最终结果集中的所有文档元素。

  3. Sort阶段按1升序排列(使用inner_array降序排序)。

  4. Project结果消除了最终结果中的totalCount字段。

  5. 如果您的集合被称为-1,那么这就是您的聚合查询的外观,如上述步骤所述。

    totalCount

    我建议您仅从第一阶段开始运行查询(yourcollection),以便您可以看到每个阶段产生的内容。添加下一个阶段,看看它如何改变你的结果,然后是下一个等等。

    最后,此查询不考虑性能,因为它不在此问题的直接范围内。只要知道如果你有一个大型数据集,那么你可以利用索引并修改你的聚合查询来使用这些索引。