首页 > 解决方案 > 如何在 mongodb 中将两个对象与聚合合并,?

问题描述

我在合并对象时遇到问题,我有一个包含汽车属性的工厂模式,其中包含每辆车的参考,我想将工厂与最后注册的汽车合并。我有以下数据。

 "Factory": {
            _id: ""
            "factories" : [
               {
                 "Adress" : "...",
                 "name": "Factory A"
                 "car": [ ObjectId("5f974ac1200b1aa93fee248b") ]
               },
               {
                 "Adress" : "...",
                 "name": "Factory B"
                 "car": [ ObjectId("5f974ac1200b1aa93fee248b") ]
               }
              
            ],

        },

汽车收藏:

"Car" : 
      _id: ObjectId("5f974ac1200b1aa93fee248b")
      "color" : "...",
      "feature": "..."
},
    

我期望的输出:

[
  {
   "Factory A": {
      "Adress" : "...",
      "name": "Factory A"
      "cars": {
          _id: ObjectId("5f974ac1200b1aa93fee248b")
          "color" : "...",
          "feature": "..."
         }
    },
    "Factory B": {
      "Adress" : "...",
      "name": "Factory B"
      "car": {
          _id: ObjectId("5f974ac1200b1aa93fee248b")
          "color" : "...",
          "feature": "..."
         }
    },
  }
]

我得到的输出:

"Factory A": {
  {
    "Adress" : "...",
    "name": "Factory A",
    "car": [ ObjectId("5f974ac1200b1aa93fee248b") ]
  },
  "car": {
    _id: ObjectId("5f974ac1200b1aa93fee248b")
    "color" : "...",
      "feature": "..."
  }
}
"Factory B": {
  {
    "Adress" : "...",
    "name": "Factory B",
    "car": [ ObjectId("5f974ac1200b1aa93fee248b") ]
  },
  "car": {
    _id: ObjectId("5f974ac1200b1aa93fee248b")
    "color" : "...",
      "feature": "..."
  }
}

这是我的操作:

db.getCollection('factory').aggregate([
{ $match: { "_id": ObjectId("5f9740f38591d84413600db0") } },
{ $unwind: "$factories"},
{ $group: { _id: null, allFactories: { $addToSet: "$factories"} } },
{ $unwind: "$allFactories" },
{
    $lookup: {
      from: "cars",
      localField: "allFactories.car",
      foreignField: "_id",
      as: "cars"
    }
},
{ $sort: { "cars._id": -1 } },
{ $unwind: "$cars" },
{ $group: {_id:"$allFactories.name", lastMatch: { $last: "$$ROOT"} }}

请问这种方法有什么帮助吗?

标签: mongodbaggregation-framework

解决方案


你可以试试这个查询。您将不得不稍微调整一下 ObjectIds。我使用了字符串,因为文档在 mongo 操场上给出了错误。但我认为那将是直截了当的。

db.factory.aggregate([
  {
    "$match": {
      "_id": 1
    }
  },
  {
    $unwind: "$factories"
  },
  {
    "$unwind": "$factories.car"
  },
  {
    "$lookup": {
      "from": "cars",
      "localField": "factories.car",
      "foreignField": "id",
      "as": "factories.car"
    }
  },
  {
    "$unwind": "$factories.car"
  },
  { "$group": {
  "_id": null,
  "data": {
    "$push": {
      "k": "$factories.name",
      "v": "$factories"
    }
  }
}},
{ "$replaceRoot": {
  "newRoot": { "$arrayToObject": "$data" }
}}
])

蒙戈游乐场


推荐阅读