如何在mongodb查询中将数组转换为对象?

时间:2020-09-29 15:25:42

标签: mongodb mongodb-query

我是mongodb的新手,想使用管道将数组转换为对象。例如,

{
     field1: [1,2,3,4,5],
     field2: [‘a’,’b’,’c’,’d’,’e’],
 }

我希望将以上文档转换为

{
      fields: [
           {
                 field1: 1,
                 field2: ‘a’
            },
            ......
           {
                  field1: 5,
                  field2: ‘e’
            }
       ]
  }

有什么想法可以实现吗?

2 个答案:

答案 0 :(得分:0)

您可以使用$zip$map$reduce来实现:

db.collection.aggregate([
  {
    "$addFields": {
      fields: {
        $reduce: {
          input: {
            $zip: {
              inputs: [
                {
                  $map: {
                    input: "$field1",
                    as: "f1",
                    in: {
                      field1: "$$f1"
                    }
                  }
                },
                {
                  $map: {
                    input: "$field2",
                    as: "f2",
                    in: {
                      field2: "$$f2"
                    }
                  }
                }
              ]
            }
          },
          initialValue: [],
          in: {
            "$concatArrays": [
              [
                {
                  "$mergeObjects": "$$this"
                }
              ],
              "$$value"
            ]
          }
        }
      }
    }
  }
])

MongoPlayground

确保field1field2的长度相等,否则将会丢失一些数据。

答案 1 :(得分:0)

您可以使用$unwind来分隔阵列。

然后使用$project格式化新列表,而不会忘记删除$unwind创建的重复项。

db.collection.aggregate({
  "$unwind": {
    path: "$field1",
    includeArrayIndex: "field1_index"
  }
},
{
  "$unwind": {
    "path": "$field2",
    "includeArrayIndex": "field2_index"
  }
},
{
  "$project": {
    "fields": {
      "field1": "$field1",
      "field2": "$field2"
    },
    "diff": {
      $cmp: [
        "$field1_index",
        "$field2_index"
      ]
    }
  }
},
{
  "$match": {
    "diff": 0
  }
},
{
  $group: {
    _id: "$_id",
    fields: {
      $push: "$fields"
    }
  }
})

尝试here