在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