Как преобразовать массив в объект в запросе mongodb?

#mongodb #mongodb-query

#mongodb #mongodb-запрос

Вопрос:

Я новичок в mongodb и хотел преобразовать свой массив в объект с помощью конвейера. Например,

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

Я хочу, чтобы приведенный выше документ был преобразован в,

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

Есть идеи, как я могу этого добиться?

Ответ №1:

Вы можете использовать $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"
    }
  }
})
  

Попробуйте здесь

Ответ №2:

Для достижения этой цели вы можете использовать $ 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

Убедитесь, что оба field1 и field2 имеют одинаковую длину, иначе вы потеряете некоторые данные.