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

在mongodb中按日期获取最新的完整记录,mongodb,mongodb-query,aggregation-framework,mongodb-java,Mongodb,Mongodb Query,Aggregation Framework,Mongodb Java,我有一个包含以下对象(事件记录)的集合: {_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

我有一个包含以下对象(事件记录)的集合:

{_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}
db.items.aggregate(
   [
     {
       $group:
         {
           _id: "$type",
           lastDate: { $last: "$date" }
         }
     }
   ]
)
{ _id: 2, lastDate: 2/1}
我想获取每个类型的最新日期的完整对象,因此在上面的示例中,它应该返回ID为2、5、6的记录

我正在执行以下管道查询:

{_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}
db.items.aggregate(
   [
     {
       $group:
         {
           _id: "$type",
           lastDate: { $last: "$date" }
         }
     }
   ]
)
{ _id: 2, lastDate: 2/1}
但这只会返回这样的文档:

{_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}
db.items.aggregate(
   [
     {
       $group:
         {
           _id: "$type",
           lastDate: { $last: "$date" }
         }
     }
   ]
)
{ _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
类型更改为
ISODate
时间戳
,然后使用聚合。首先排序
日期
并分组,然后进行如下查询

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

例外:组聚合字段“val2”必须定义为object@AndresQ:但是我想你已经明白了。但是这会将val2设置为所有val2中的最后一个,而不是原始文档中相应的val2