如何在JSON数据中使用mongoDB的聚合操作

时间:2017-09-21 17:46:40

标签: node.js mongodb mongoose aggregation-framework

  

假设这是输入JSON数据和集合名称。

  [
    {
        "time": ISODate("2016-11-27T011:43:01.000+05:30"), 'userId': 'abc'
    },
    {
        "time": ISODate("2016-11-28T01:43:01.000+05:30"),'userId': 'pqr'
    },
    {
        "time": ISODate("2016-11-27T08:43:01.000+05:30"), 'userId': 'abc'
    },
    {
        "time": ISODate("2016-11-27T02:43:01.000+05:30"), 'userId': 'abc'
    },
    {
        "time": ISODate("2016-11-27T011:43:01.000+05:30"), 'userId': 'pqr'
    },
    {
        "time": ISODate("2016-11-28T011:43:01.000+05:30"), 'userId': 'abc'
    }
]

在上面给出的JSON数据中,我们维护了用户登录集合。我们必须在用户首次记录与日期对应的数据时找出数据。我们必须对这个json数据执行操作,以便输出应该采用这种格式。

输出

[{"date": "2016-11-27",
  'user': [{'userId':'abc','time': ISODate("2016-11-27T08:43:01.000+05:30")},
            'userId':'pqr','time': ISODate("2016-11-27T11:43:01.000+05:30")]
 },
 {"date": "2016-11-28",
  'user': [{'userId':'abc','time': ISODate("2016-11-28T11:43:01.000+05:30")},
            'userId':'pqr','time': ISODate("2016-11-28T1:43:01.000+05:30")]
 }]

1 个答案:

答案 0 :(得分:1)

您可以尝试以下聚合查询。

db.collection_name.aggregate([
  {
    "$sort": {
      "userId": 1,
      "time": -1
    }
  },
  {
    "$group": {
      "_id": {
        "date": {
          "$dateToString": {
            "format": "%Y-%m-%d",
            "date": "$time"
          }
        },
        "userId": "$userId"
      },
      "time": {
        "$first": "$time"
      }
    }
  },
  {
    "$group": {
      "_id": "$_id.date",
      "user": {
        "$push": {
          "userId": "$_id.userId",
          "time": "$time"
        }
      }
    }
  },
  {
    "$sort": {
      "_id": 1
    }
  }
])