MongoDB-通过查询获取组中最大值的id
我有一个集合,其中的文档如下所示。我想得到“_id”或按“name”分组的每组中修订最多的文档的完整版本 在这种情况下,我只想选择第二个和第四个文档。我尝试了各种方法,包括聚合框架,但不能完全在MongoDB查询中实现 有解决办法吗 谢谢。您应该使用以获得预期的输出 查询如下所示:MongoDB-通过查询获取组中最大值的id,mongodb,Mongodb,我有一个集合,其中的文档如下所示。我想得到“_id”或按“name”分组的每组中修订最多的文档的完整版本 在这种情况下,我只想选择第二个和第四个文档。我尝试了各种方法,包括聚合框架,但不能完全在MongoDB查询中实现 有解决办法吗 谢谢。您应该使用以获得预期的输出 查询如下所示: db.collection.aggregate({ $group: { _id: "$name", "revision": { $max: "$revision" }
db.collection.aggregate({
$group: {
_id: "$name",
"revision": {
$max: "$revision"
}
}
}, {
$project: {
"name": "$_id",
"revision": 1,
"_id": 0
}
})
编辑
您可以使用如下查询-
db.collection.aggregate({
$sort: {
revision: -1
}
}, {
$group: {
_id: "$name",
"revision": {
"$max": "$revision"
},
"original": {
$first: "$$ROOT"
}
}
}, {
$project: {
"name": "$_id",
"revision": 1,
"_id": "$original._id"
}
})
尝试以下聚合管道,首先按修订字段降序对文档进行排序,然后按名称字段对文档进行排序,然后在系统变量表达式上使用运算符添加另一个获取完整文档的字段:
db.collection.aggregate([
{
"$sort": {
"revision": -1
}
},
{
"$group": {
"_id": "$name",
"max_revision": {
"$max": "$revision"
},
"doc": {
"$first": "$$ROOT"
}
}
}
])
输出:
/* 0 */
{
"result" : [
{
"_id" : "def",
"max_revision" : 2,
"doc" : {
"_id" : ObjectId("55aa088a58f2a8f2bd2a3796"),
"name" : "def",
"revision" : 2
}
},
{
"_id" : "abc",
"max_revision" : 2,
"doc" : {
"_id" : ObjectId("55aa088a58f2a8f2bd2a3794"),
"name" : "abc",
"revision" : 2
}
}
],
"ok" : 1
}
谢谢你的回答。这正是我以前尝试过的。问题是,这没有给出文档id。我的要求是选择那些修订最高的文档并执行一些进一步的操作。或者,如果我可以获取文档的id,至少可以在第二次查询中使用它来获取这些文档。@Sujee您可以通过发布您在问题中尝试过的内容来避免这种情况。建议这样做。请阅读指南/帮助或进行参观。感谢更新的答案。对这就是我一直在找的东西。@Elyasin谢谢你的便条。我会按照建议做的。谢谢。学习了许多新东西,例如$$ROOT sys变量。有没有更优雅的方法来查找产生最大值的文档,而不必对整个集合进行排序?与查找最大值相比,排序非常昂贵。
/* 0 */
{
"result" : [
{
"_id" : "def",
"max_revision" : 2,
"doc" : {
"_id" : ObjectId("55aa088a58f2a8f2bd2a3796"),
"name" : "def",
"revision" : 2
}
},
{
"_id" : "abc",
"max_revision" : 2,
"doc" : {
"_id" : ObjectId("55aa088a58f2a8f2bd2a3794"),
"name" : "abc",
"revision" : 2
}
}
],
"ok" : 1
}