首页 > 解决方案 > 压缩两个数组并创建新的对象数组

问题描述

大家好,我正在使用 MongoDB 数据库,其中每个数据行如下所示:

{
    "_id" : ObjectId("5cf12696e81744d2dfc0000c"),
    "contributor": "user1",
    "title": "Title 1",
    "userhasRate" : [ 
        "51",
        "52",
    ],
    "ratings" : [ 
        4,
        3
    ],

}

我需要将其更改为:

{
    "_id" : ObjectId("5cf12696e81744d2dfc0000c"),
    "contributor": "user1",
    "title": "Title 1",
    rate : [
        {userhasrate: "51", value: 4},
        {userhasrate: "52", value: 3},
    ]

}

我已经尝试使用这种方法,

db.getCollection('contens').aggregate([
    { '$group':{
            'rates': {$push:{ value: '$ratings', user: '$userhasRate'}}
        }
    }

]);

我的结果变成了这样

{
    "rates" : [ 
        {
            "value" : [ 
                5, 
                5, 
                5
            ],
            "user" : [ 
                "51", 
                "52", 
                "53"
            ]
        }
    ]
}

有人可以帮我解决我的问题,

谢谢

标签: mongodb

解决方案


你可以使用$arrayToObjectand$objectToArray里面$map来实现所需的输出。

db.collection.aggregate([
  {
    "$project": {
      "rate": {
        "$map": {
          "input": {
            "$objectToArray": {
              "$arrayToObject": {
                "$zip": {
                  "inputs": [
                    "$userhasRate",
                    "$ratings"
                  ]
                }
              }
            }
          },
          "as": "el",
          "in": {
            "userhasRate": "$$el.k",
            "value": "$$el.v"
          }
        }
      }
    }
  }
])

替代方法

如果userhasRate包含重复值,则第一个解决方案将不起作用。如果它包含重复值,您可以使用arrayElemAtand 。$map$zip

db.collection.aggregate([
  {
    "$project": {
      "rate": {
        "$map": {
          "input": {
            "$zip": {
              "inputs": [
                "$userhasRate",
                "$ratings"
              ]
            }
          },
          "as": "el",
          "in": {
            "userhasRate": {
              "$arrayElemAt": [
                "$$el",
                0
              ]
            },
            "value": {
              "$arrayElemAt": [
                "$$el",
                1
              ]
            }
          }
        }
      }
    }
  }
])

推荐阅读