node.js - Mongodb + 使用最后一个字段数据进行分组

标签 node.js mongodb mongodb-query aggregation-framework

我的集合中有示例 json 数据。

示例数据:

[{
    "_id" : 1,
    "username" : "abcd",
    "createdDate" : ISODate("2016-06-03T08:52:32.434Z")
},
{
    "_id" : 2,
    "username" : "abcd",
    "createdDate" : ISODate("2016-05-03T09:52:32.434Z")
},
{
    "_id" : 3,
    "username" : "abcd",
    "createdDate" : ISODate("2016-04-03T10:52:32.434Z")
},
{
    "_id" : 4,
    "username" : "xyz",
    "createdDate" : ISODate("2016-03-03T10:52:32.434Z")
},{
    "_id" : 5,
    "username" : "xyz",
    "createdDate" : ISODate("2016-02-03T10:52:32.434Z")
},{
    "_id" : 6,
    "username" : "zzz",
    "createdDate" : ISODate("2016-01-03T10:52:32.434Z")
}]

我需要根据以下条件检索此数据。

  1. 按用户名分组。
  2. 用户名不等于“zzz”
  3. 按日期顺序排序。
  4. 还需要日期字段(其中有最新/最后记录)。
  5. 获取总数。

预期输出:

[{
    "username" : "abcd",
    "createdDate" : "2016-06-03T08:52:32.434Z",
        "total" : 3
},
{
    "username" : "xyz",
    "createdDate" : "2016-03-03T10:52:32.434Z",
        "total" : 2
}]

查询:

db.logs.aggregate([
    { "$match": { "username": { "$ne": "zzz" } }},

    { "$group": {
        "_id": {
            "username": "$username",
            "createdDate": "$createdDate"
        },
        "count": { "$sum": 1 }
    }}])

最佳答案

试试这个:

    db.logs.aggregate([
   {
      "$match":{
         "username":{
            "$ne":"zzz"
         }
      }
   },
   {
      "$group":{
         _id:"$username",
         "count":{
            "$sum":1
         },
         date:{
            $max:"$createdDate"
         }
      }
   },
   {
      $project:{
         username:"$_id",
         total:"$count",
         createdDate:"$date"
      }
   }
])

输出

  {
   "_id":"xyz",
   "username":"xyz",
   "total":2,
   "createdDate":   ISODate("2016-03-03T10:52:32.434   Z")
}{
   "_id":"abcd",
   "username":"abcd",
   "total":3,
   "createdDate":   ISODate("2016-06-03T08:52:32.434   Z")
}

在线尝试:mongoplayground.net/p/3_-s2tUjPFi

关于node.js - Mongodb + 使用最后一个字段数据进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41481771/

相关文章:

javascript - 实现缓冲的转换流

javascript - 在数组(或对象)上迭代异步的最聪明/最干净的方法是什么?

python - 按最接近字段的日期对 Mongodb 查询中的文档进行排序

javascript - 使用 Mongoose 保存多个文档并在保存最后一个文档时执行某些操作

node.js - 查找 ObjectId _id 但 Schema 已将 _id 定义为 String

node.js - 使用 NPM 测试跳过用户输入

javascript - babel-node 未显示错误

excel - 如何将 mongoDB 数据导出为 CSV 格式?

java - 如何将 MongoDB 结果从 $dateToString 操作转换为 Java 对象

mongodb - mongo查询多个条件