在MongoDB上,如何从此列表中选择具有最新日期的元素:
[{
"_id" : ObjectId("5c5064f39d0c4b52cf6d1d55"),
"Date" : "12-09-2018",
"Type" : "A",
"Value" : 73650.14
},
{
"_id" : ObjectId("5c5064f39d0c4b52cf6d1d15"),
"Date" : "12-09-2018",
"Type" : "B",
"Value" : 73650.14
},
{
"_id" : ObjectId("5c5064f39d0c4b52cf6d1d58"),
"Date" : "13-09-2018",
"Type" : "A",
"Value" : 80000
},
{
"_id" : ObjectId("5c5064f39d0c4b52cf6d1d56"),
"Date" : "13-09-2018",
"Type" : "B",
"Value" : 800000
}]
为了获得此列表:
[{
"_id" : ObjectId("5c5064f39d0c4b52cf6d1d58"),
"Date" : "13-09-2018",
"Type" : "A",
"Value" : 80000
},
{
"_id" : ObjectId("5c5064f39d0c4b52cf6d1d56"),
"Date" : "13-09-2018",
"Type" : "B",
"Value" : 800000
}]
这可能很容易,但尽管进行了许多研究,我还是无法做到。我尝试使用 $group 运算符制作它,但我从未找到如何推送所需的值(要么我只获得了 Date 或没有任何过滤器的所有元素)。
我是Mongo DB的新手,非常感谢您的帮助。
谢谢
MongoDB 3.6 的以下查询为每个文档添加一个新日期字段,按该字段分组并将该组中的文档推送到数组中,按_id(日期)降序排序,限制为第一个文档(最近日期),展开文档数组,然后通过替换每个文档的根并投影原始字段来清理结果。
db.colx.aggregate([{
$addFields: {
ISODate: {
$dateFromString: {
dateString: "$Date"
}
}
}
}, {
$group: {
_id: "$ISODate",
items: {
$push: "$$ROOT"
}
}
}, {
$sort: {
_id: -1
}
}, {
$limit: 1
}, {
$unwind: "$items"
}, {
$replaceRoot: {
newRoot: "$items"
}
}, {
$project: {
_id: 1,
Date: 1,
Type: 1,
Value: 1
}
}])
输出:
{ "_id" : ObjectId("5c5064f39d0c4b52cf6d1d58"), "Date" : "13-09-2018", "Type" : "A", "Value" : 80000 }
{ "_id" : ObjectId("5c5064f39d0c4b52cf6d1d56"), "Date" : "13-09-2018", "Type" : "B", "Value" : 800000 }