MongoDB –如何使用< field_value>返回文档作为< field_key&gt ;? [英] MongoDB – How do I return documents with <field_value> as <field_key>?

查看:66
本文介绍了MongoDB –如何使用< field_value>返回文档作为< field_key&gt ;?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

经过一些研究,我已经看到了通过mongoDB的$ mapReduce功能解决此问题的方法,但是我没有设法使其正常工作.这就是我要处理的内容:

After some research I've seen ways to go around this through mongoDB's $mapReduce feature, however I haven't managed to get it working.. Here's what I'm dealing with:

[
  {
    _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'
  }
]

汇总后的预期结果应如下所示:

The expected result after aggregation should look like this:

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

推荐答案

您可以使用聚合框架使用 $group 将文档按device_id分组,然后按 > arrayToObject 以获取一个值作为键:

You can achieve this with the aggregation framework using a $group to group documents by device_id, followed by a arrayToObject to get a value as key:

查询如下:

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

这篇关于MongoDB –如何使用< field_value>返回文档作为< field_key&gt ;?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆