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

如何在mongodb查询中将数组转换为对象?,mongodb,mongodb-query,Mongodb,Mongodb Query,我是mongodb新手,希望使用管道将数组转换为对象。比如说, { field1: [1,2,3,4,5], field2: [‘a’,’b’,’c’,’d’,’e’], } 我希望将上述文档转换为 { fields: [ { field1: 1, field2: ‘a’ }, ...... {

我是mongodb新手,希望使用管道将数组转换为对象。比如说,

{
     field1: [1,2,3,4,5],
     field2: [‘a’,’b’,’c’,’d’,’e’],
 }
我希望将上述文档转换为

{
      fields: [
           {
                 field1: 1,
                 field2: ‘a’
            },
            ......
           {
                  field1: 5,
                  field2: ‘e’
            }
       ]
  }
你知道我怎样才能做到这一点吗?

你可以使用和来实现这一点:

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"
            ]
          }
        }
      }
    }
  }
])

确保
field1
field2
长度相等,否则会丢失一些数据。

您可以使用和来实现此目的:

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"
            ]
          }
        }
      }
    }
  }
])

确保
field1
field2
长度相等,否则会丢失一些数据。

您可以使用来分隔阵列

然后使用
$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"
    }
  }
})
试试它

您可以使用它来分隔阵列

然后使用
$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"
    }
  }
})
试试看