【问题标题】:MongoDB - Get last date of every distinct nameMongoDB - 获取每个不同名称的最后日期
【发布时间】:2021-09-22 10:07:06
【问题描述】:

我正在启动 MongoDB,但遇到了有关如何创建查询以按每个不同名称的最后日期过滤文档并检索整个文档的问题。

我的收藏中有一些数据(学生):

{ "_id" : ObjectId("61479d4bc146b1663a8f2b7d"), "city" : "SAO PAULO", "name" : "ANA", "status" : "ACTIVE", "date1" : ISODate("2020-09-01T08:14:30.000Z") }
{ "_id" : ObjectId("61479d88c146b1663a8f2b7e"), "city" : "SAO PAULO", "name" : "MARIA", "status" : "ACTIVE", "date1" : ISODate("2020-08-01T04:16:00.000Z") }
{ "_id" : ObjectId("61479dc2c146b1663a8f2b7f"), "city" : "RIO DE JANEIRO", "name" : "MARIA", "status" : "ACTIVE", "date1" : ISODate("2021-02-01T11:10:00.000Z") }
{ "_id" : ObjectId("61479df1c146b1663a8f2b80"), "city" : "SAO PAULO", "name" : "MARIA", "status" : "INACTIVE", "date1" : ISODate("2021-02-01T11:15:00.000Z") }
{ "_id" : ObjectId("61479e60c146b1663a8f2b81"), "city" : "BRASILIA", "name" : "JOHH", "status" : "ACTIVE", "date1" : ISODate("2021-06-01T01:18:00.000Z") }

我正在创建一个查询来过滤状态“ACTIVE”并仅显示每个学生的最新数据,仅显示“city”、“name”、“date”,我正在尝试使用 $MAX 或 $最后进入组:

db.getCollection('students').aggregate([
   { $match: { status: "ACTIVE" } },
   { $group: { _id: { name : "$name"},
         date1 : { $max : "$date1" } ,
         city : { $max : "$city" } } }
])

想要的结果:

{ "city" : "SAO PAULO", "name" : "ANA", "date1" : ISODate("2020-09-01T08:14:30.000Z") }
{ "city" : "RIO DE JANEIRO", "name" : "MARIA", "date1" : ISODate("2021-02-01T11:10:00.000Z") }
{ "city" : "BRASILIA", "name" : "JOHH", "date1" : ISODate("2021-06-01T01:18:00.000Z") }

但结果是这样的:

{ "city" : "SAO PAULO", "name" : "ANA", "date1" : ISODate("2020-09-01T08:14:30.000Z") }
{ "city" : "SAO PAULO", "name" : "MARIA", "date1" : ISODate("2021-02-01T11:10:00.000Z") }
{ "city" : "BRASILIA", "name" : "JOHH", "date1" : ISODate("2021-06-01T01:18:00.000Z") }

它正在检索错误的数据。对于 ANA 和 JOHN(每人只有一份文件),没关系。 但是 MARIA 有三个文档,我需要从她的文档中检索 $max 日期的所有数据,并且我正在检索 "city" : "SAO PAULO" 而不是 "c​​ity" : "RIO DE JANEIRO" 因为运算符 $ MAX 也适用于该字段。这适用于所有字段,并且 GROUP 运算符不允许删除 MAX 运算符。

我不知道如何修复它。 如何获取整个文档,按“每个不同名称的最后日期”过滤?

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    您可以使用此聚合管道:

    • 首先$match,就像你一样。
    • 然后$sort 在第一个位置获得所需的值。这将在下一阶段使用。
    • $group 聚合中,您将获得$first 值(在对文档进行排序时,第一个值将是所需的值)。
    • 最后$project 以获得所需的输出。
    db.collection.aggregate([
      {
        "$match": {
          "status": "ACTIVE"
        }
      },
      {
        "$sort": {
          "date1": -1
        }
      },
      {
        "$group": {
          "_id": {
            "name": "$name"
          },
          "date1": {
            "$first": "$date1"
          },
          "city": {
            "$first": "$city"
          }
        }
      },
      {
        "$project": {
          "_id": 0,
          "name": "$_id.name",
          "city": 1,
          "date1": 1
        }
      }
    ])
    

    例如here

    【讨论】:

      猜你喜欢
      • 2021-12-05
      • 2021-11-04
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多