我有一些文件,比如:

{
    "_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_value1
Group您的结果,以便我们得到每个文档如何inner_array.object = 1的总数。
totalCount计算中,$sum只发生在值为inner_array.object_value1元素上。
同样在分组中,我将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/

10-11 13:37
查看更多