MongoDB - 如何将<field_value>的文档作为<field_key>返回?

时间:2018-03-30 05:37:15

标签: node.js mongodb express mongoose

经过一些研究后,我已经看到了通过mongoDB的$ mapReduce功能解决这个问题的方法,但是我还没有设法让它工作。这就是我正在处理的事情:

[
  {
    _id: '1',
    device_id: 'ML39A-341D4-UI041',
    date: '2018-03-28T00:00:00.000Z'
  },
  {
    _id: '2',
    device_id: 'ML39A-341D4-UI041',
    date: '2018-03-29T00:00:00.000Z'
  },
  {
    _id: '3',
    device_id: 'D4YK2-R2D20-KYPI9'
    date: '2018-04-01T00:00:00.000Z'
  }
]

聚合后的预期结果应如下所示:

[
  {
    'ML39A-341D4-UI041': [
      '2018-03-28T00:00:00.000Z',
      '2018-03-29T00:00:00.000Z'
    ]
  },
  {
    'D4YK2-R2D20-KYPI9': [
      '2018-04-01T00:00:00.000Z'
    ]
  }
]

1 个答案:

答案 0 :(得分:1)

您可以使用聚合框架使用 $group device_id对文档进行分组,然后使用 arrayToObject 来实现此目的得到一个值作为关键:

查询如下所示:

db.collection.aggregate([{
  "$group": {
    "_id": "$device_id",
    "dt": {
      "$push": "$date"
    }
  }
}, {
  "$replaceRoot": {
    "newRoot": {
      "$arrayToObject": {
        "$concatArrays": [
          [{
            "k": "$_id",
            "v": "$dt"
          }]
        ]
      }
    }
  }
}])

结果:

[
  {
    "D4YK2-R2D20-KYPI9": [
      "2018-04-01T00:00:00.000Z"
    ]
  },
  {
    "ML39A-341D4-UI041": [
      "2018-03-28T00:00:00.000Z",
      "2018-03-29T00:00:00.000Z"
    ]
  }
]

你可以在这里试试:mongoplayground.net/p/t9AjMA0nXCn