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

标签 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。

我做了一些搜索,但仍然无法找到一种方法,而不是获取所有文档并编写代码进行过滤和排序。我如何在 native mongo 指令中执行此操作?

提前致谢!

最佳答案

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

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


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

  1. Unwind你的inner_array大批。这将有助于计算 inner_array.object_value等于 1 .
  2. Group您的结果,以便我们获得总计数 inner_array.object = 1每个文档。

    totalCount计算后,$sum仅发生于 inner_array.object_value值为 1 的元素.

    还在分组中,我添加 inner_array回到阶段结果,因为我假设您希望查看最终结果集中的所有文档元素。

  3. Sort阶段成绩totalCount按升序排列(使用 -1 进行降序排列)。

  4. 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/

相关文章:

javascript - 为什么 sortBy() 不起作用

mongodb - $lookup 与 php mongodb

php - 为什么 GridFS 文件名和字节为空?

mysql - 如何在 MySQL 8 中通过 int 而不是通过名称从嵌套 JSON 中获取

javascript - 在 mongodb 中,作为 key 而不是匿名用户的用户名和密码传递什么?

java - 在 JTable 中插入后如何进行排序(RowSort)?

java - 如何在mongo中插入带有日期的文档?

mongodb - Mongo聚合框架无法按两个字段排序?

javascript - 首先通过在其他数组中包含 ID 对数组进行排序,然后按日期排序

c++ - 对数组或 vector 进行排序和聚类