用于查找最新数据的mongodb聚合

用于查找最新数据的mongodb聚合,mongodb,find,aggregation-framework,aggregate,Mongodb,Find,Aggregation Framework,Aggregate,我有一个模型看起来像 { "_id" : ObjectId("5b975b7ffb8361fa0cdacc41"), "refid" : 1, "item" : "xyz1", "qnid" : 1 } { "_id" : ObjectId("5b975b7ffb8361fa0cdacc42"), "refid" : 1, "item" : "xyz2", "qnid" : 2 } { "_id" : ObjectId("5b975b7ffb8361fa0cdacc43"), "refid" :

我有一个模型看起来像

{
"_id" : ObjectId("5b975b7ffb8361fa0cdacc41"),
"refid" : 1,
"item" : "xyz1",
"qnid" : 1
}
{
"_id" : ObjectId("5b975b7ffb8361fa0cdacc42"),
"refid" : 1,
"item" : "xyz2",
"qnid" : 2
}
{
"_id" : ObjectId("5b975b7ffb8361fa0cdacc43"),
"refid" : 1,
"item" : "xyz3",
"qnid" : 3
}
{
"_id" : ObjectId("5b975b7ffb8361fa0cdacc44"),
"refid" : 4,
"item" : "xyz4",
"qnid" : 4
}
{
"_id" : ObjectId("5b975b7ffb8361fa0cdacc45"),
"refid" : 4,
"item" : "xyz5",
"qnid" : 5
}
这里refid是文章的参考id,qnid是保存版本的实际id。我想获取所有文章,即使用最新版本数据重新注册

我想通过refid

第refid 1条的qnid 3是最近的一条。第refid 4条将qnid 5作为最近的一条。 即

请帮我怎么做。
我使用了带排序的聚合函数,但它没有提供数据,您可以在3.4中使用下面的聚合

refid asc和qnid desc上的
$sort

$group
通过refid和
$first
通过
$$ROOT
访问整个文档

$replaceRoot
将数据提升到顶部

db.collection.aggregate([
  {"$sort":{"refid":1,"qnid":-1}},
  {"$group":{
    "_id":"$refid",
    "data":{"$first":"$$ROOT"}
  }},
  {"$replaceRoot":{"newRoot":"$data"}}
])

谢谢你的回答。。但这对我不起作用。im使用mongo v3.6.5版。但是我得到[thread1]错误:命令失败:{“ok”:0,“errmsg”:“无法识别的管道阶段名称:'replaceRoot'”,“代码”:40324,“代码名”:“Location40324”}:聚合失败:@user2705938&veeram
replaceRoot
应该是
$replaceRoot
@AnthonyWinzlet-ah。非常感谢。更新了。它按照我想要的方式工作。。谢谢@Veeram和Anthony在这方面面临另一个问题。如果我想按照createdAt以及refid和qnid进行排序,那么按照createdAt进行排序不起作用,因为它已经按照refid和qnid进行了排序。如何将记录与所有3个一起排序?我尝试了{“$sort”:{“refid”:1,“qnid”:-1,“createdAt”:-1}},并在结尾处尝试了.sort({“createdAt”:-1})。我怎样也能按日期排序?
db.collection.aggregate([
  {"$sort":{"refid":1,"qnid":-1}},
  {"$group":{
    "_id":"$refid",
    "data":{"$first":"$$ROOT"}
  }},
  {"$replaceRoot":{"newRoot":"$data"}}
])