简体   繁体   English

我们如何在 mongodb 中找到每个组的最近记录?

[英]How can we find the recent record from each group in mongodb?

I want to find out most recent record from each group.我想找出每个组的最新记录。 My collection:-我的收藏:-

{ "_id" : ObjectId("1"), "loginID" : Ram.1234@gmail.com , "name" : Ram, "date" : ISODate("2017-02-01T00:00:00Z"),Site:blog.com,opertion:modified }
{ "_id" : ObjectId("2"), "loginID" : Arjun34@gmail.com, "name" : Arjun, "date" : ISODate("2017-02-01T00:00:00Z").site:ketanblog.com,opertion:updated }
{ "_id" : ObjectId("3"), "loginID" :Ram.1234@gmail.com , "name" : Ram, "date" : ISODate("2017-02-03T00:00:00Z"),Site:blogtec.com,opertion:modified }
{ "_id" : ObjectId("4"), "loginID" : Arjun34@gmail.com, "name" : Arjun, "date" : ISODate("2017-02-08T00:00:00Z"),Site:blogpec.com,opertion:updated }
{ "_id" : ObjectId("5"), "loginID" : Arjun34@gmail.com, "name" : Arjun, "date" : ISODate("2017-02-07T00:00:00Z") ,Site:blog.com,opertion:read}
{ "_id" : ObjectId("6"), "loginID" : shyam78@gmail.com, "name" : Shyam, "date" : ISODate("2017-02-09T00:00:00Z"),site:ketanblog.com,opertion:deleted }
{ "_id" : ObjectId("7"), "loginID" : shyam78@gmail.com, "name" : Shyam, "date" : ISODate("2017-02-03T00:00:00Z") ,site:ketanblog.com,opertion:updated}
{ "_id" : ObjectId("8"), "loginID" : Arjun34@gmail.com, "name" : Arjun, "date" : ISODate("2017-02-03T00:00:00Z"),Site:blogtrt.com,opertion:read  }

My Expected output:-我预期的 output:-

{ "_id" : ObjectId("3"), "loginID" : Ram.1234@gmail.com, "name" : Ram, "date" : ISODate("2017-02-03T00:00:00Z"),Site:blogtec.com,opertion:modified  }
{ "_id" : ObjectId("4"), "loginID" : Arjun34@gmail.com, "name" : Arjun, "date" : ISODate("2017-02-08T00:00:00Z"),Site:blogpec.com,opertion:updated  }
{ "_id" : ObjectId("6"), "loginID" : shyam78@gmail.com, "name" : Shyam, "date" : ISODate("2017-02-09T00:00:00Z"),Site:ketanblog.com,opertion:deleted  }
  1. Sort by date to keep the latest data for each group at the top按日期排序以将每个组的最新数据保留在顶部
  2. Group by login id, get the first record for each group which is latest.按登录ID分组,获取每个组的第一条记录,这是最新的。 It discards other records in each group它丢弃每个组中的其他记录
db.coll.aggregate([
{
  $sort : {"$date": - 1}
}, 
{
 $group: {
   _id : "$loginID", 
  data : { 
    $first : "$$ROOT" 
  } 
 } 
}
])

You can try,你可以试试,

  • $sort by date descending order $sort按日期降序排序
  • $group by loginID and add first recent document in recent $group by loginID并在recent添加第一个最近的文档
  • $replaceRoot to replace recent into new root $replaceRootrecent的替换为新的根
  • $sort new grouped documents $sort新的分组文档
db.collection.aggregate([
  { $sort: { date: -1 } },
  {
    $group: {
      _id: "$loginID",
      recent: { $first: "$$ROOT" }
    }
  },
  { $replaceRoot: { newRoot: "$recent" } },
  { $sort: { date: -1 } }
])

Playground操场

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM