在 mongodb 中按日期获取最新的完整记录

Get the latest WHOLE record by date in mongodb

我有一个包含对象(事件记录)的集合,如下所示:

{_id: 1, type: "A", val2: "x", val3: "z", date: 1/1}
{_id: 2, type: "A", val2: "y", val3: "y", date: 2/1}
{_id: 3, type: "C", val2: "z", val3: "x", date: 3/1}
{_id: 4, type: "B", val2: "x", val3: "z", date: 4/1}
{_id: 5, type: "C", val2: "y", val3: "y", date: 5/1}
{_id: 6, type: "B", val2: "z", val3: "x", date: 6/1}

我想为每种类型的最新日期获取 完整对象 ,因此在上面的示例中它应该 return 记录 ID:2、5 , 6

我正在做这样的管道查询:

db.items.aggregate(
   [
     {
       $group:
         {
           _id: "$type",
           lastDate: { $last: "$date" }
         }
     }
   ]
)

但是 return 我只有这样的文档:

{ _id: 2, lastDate: 2/1}

而我想要 整个对象(带有 val2、val3 等)

我怎样才能做到这一点?

谢谢

您只能对特定项目执行此操作

db.items.aggregate(
 [
   {
     $group:
       {
         _id: "$type",
         lastDate: { $last: "$date" },
         val2: { $last: "$val2" },
         val3: { $last: "$val3" }
       }
   }
 ]
)

请注意,您应该使用 ISODate 作为日期和时间字段的类型。

根据 Markus W Mahlberg 首先回答,您应该将 date 类型更改为 ISODatetimestamp,然后使用聚合。首先排序 date 和分组然后像下面的查询

db.collectionName.aggregate({"$sort":{"date":-1}},
                      {"$group":{"_id":"$type","lastDate":{"$first":"$date"},
                      "val2":{"$first":"$val2"},"val3":{"$first":"$val3"}}})