【问题标题】:MongoDB grouping and max item?MongoDB分组和最大项目?
【发布时间】:2020-04-18 08:48:42
【问题描述】:

对于我的一生,我不知道如何在 MongoDB 中编写这个查询!

我需要从查询中返回行,其中最大“修订”是为项目返回的行

我有两个部分:

  1. 在不实际获取数据的情况下返回计数。
  2. 返回所有数据(不一定按 A 列的顺序,但会 有帮助)基于分组。

这是一个样本集(在我们的真实数据中,我们有大约 40 列和数百万行):

A B C D 修订 --------+-------+-------+--------+------------ 项目 1 100 200 300 1 项目 1 111 222 333 2 项目 2 200 500 800 1 项目 2 222 555 888 2 项目 2 223 556 889 3 项目 3 300 600 900 1 项目 4 400 700 1000 1

我需要退回的东西:

  1. 返回数:4
  2. 返回的数据: A B C D 修订 --------+-------+-------+--------+-------- 项目 1 111 222 333 2 项目 2 223 556 889 3 项目 3 300 600 900 1 项目 4 400 700 1000 1

我一直在尝试很多组合或$group$count,甚至尝试使用 SQL 到 MongoDB 查询翻译工具,但似乎无法正常工作。

请提前帮助和感谢!

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    试试下面的查询:

    db.collection.aggregate([
      {
        $group: {
          _id: "$A",
          A: { $first: "$A" },
          B: { $max: "$B" },
          C: { $max: "$C" },
          D: { $max: "$D" },
          Revision: { $max: "$Revision" },
        }
      },
      {
        $project: { _id: 0 },
      },
      {
        $group: {
          _id: "",
          count: { $sum: 1 },
          data: { $push: "$$ROOT" }
        }
      }
    ]);
    

    测试: mongoplayground

    因此,在 data 字段中,您将拥有实际文档,其中 count 代表集合中唯一 'A' 的数量。

    如果你不希望结果是这样的,你可以试试下面的查询:

    db.collection.aggregate([
      {
        $group: {
          _id: "$A",
          A: { $first: "$A" },
          B: { $max: "$B" },
          C: { $max: "$C" },
          D: { $max: "$D" },
          Revision: { $max: "$Revision" },
        }
      },
      {
        $project: { _id: 0 },
      }
    ])
    

    测试: mongoplayground

    它将返回一个对象数组,因为聚合将始终返回一个游标,该游标将在代码中解析为一个数组,然后您可以在数组上执行.length 以获得总计数,而不是首先使用第二个$group 阶段查询以获取总数,这是另一种选择。

    【讨论】:

    • 谢谢。查询有效。在您的指导下,我想我可以继续前进。
    猜你喜欢
    • 2014-10-30
    • 2023-03-04
    • 2015-06-12
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多