【问题标题】:MongoDB – How do I return documents with <field_value> as <field_key>?MongoDB – 如何以 <field_value> 作为 <field_key> 返回文档?
【发布时间】:2018-09-09 04:09:00
【问题描述】:

经过一些研究,我已经看到了通过 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'
    ]
  }
]

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    您可以使用聚合框架实现此目的,使用 $groupdevice_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

    【讨论】:

    • 你是个巫师!!非常感谢
    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2021-06-17
    • 2019-01-10
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    相关资源
    最近更新 更多