mongodb - 如何在 MongoDB $lookup 中使用变量

标签 mongodb aggregation-framework

假设我有 3 个集合,汽车自行车车辆

汽车 集合为:

{
  {
    "_id": "car1",
    "carBrand": "Audi",
    "color": "blue"
  },
  {
    "_id": "car2",
    "carBrand": "BMW",
    "color": "white"
  }
}

自行车 集合为:

{
  {
    "_id": "bike1",
    "bikeBrand": "Audi",
    "color": "red"
  },
  {
    "_id": "bike2",
    "carBrand": "BMW",
    "color": "white"
  }
}

vehicles 集合实际上只是引用了carsbikes 集合作为

{
  {
    "_id": "vehicle1",
    "vehicleType": "cars",
    "vehicleId": "car1"
  },
  {
    "_id": "vehicle2",
    "vehicleType": "cars",
    "vehicleId": "car2"
  },
  {
    "_id": "vehicle3",
    "vehicleType": "bikes",
    "vehicleId": "bike1"
  },
  {
    "_id": "vehicle4",
    "vehicleType": "bikes",
    "vehicleId": "bike2"
  },

}

我想加入 vehicles 集合以及 carsbikes 集合。我尝试将 "$vehicleType" 设置为 $lookupfrom 字段的变量。但是它没有像我预期的那样工作。它根本不加入表格。没有错误。

db.collection.aggregate([{

  $lookup: {
      from: "$vehicleType",
      localField: "vehicleId",
      foreignField: "_id",
      as: "vehicleDetails"
  }

}]);

我期待的是这样的结果

{
  {
    "_id": "vehicle1",
    "vehicleType": "cars",
    "vehicleId": "car1",
    "vehicleDetails": {    
      "_id": "car1",
      "carBrand": "Audi",
      "color": ""
    }
  },
  {
    "_id": "vehicle2",
    "vehicleType": "cars",
    "vehicleId": "car2",
    "vehicleDetails":    {
      "_id": "car2",
      "carBrand": "BMW",
      "color": "white"

  },
  {
    "_id": "vehicle3",
    "vehicleType": "bikes",
    "vehicleId": "bike1",
    "vehicleDetails":    {
      "_id": "bike1",
      "bikeBrand": "Audi",
      "color": "red"
    }
  },
  {
    "_id": "vehicle4",
    "vehicleType": "bikes",
    "vehicleId": "bike2",
    "vehicleDetails":    {
      "_id": "bike2",
      "carBrand": "BMW",
      "color": "white"
    }
  },

}    

最佳答案

如果汽车和自行车没有共同的 ID,您可以在单独的数组中按顺序查找,然后将它们与 $setUnion 组合起来:

db.vehicles.aggregate([
  {$lookup: {
      from: "cars",
      localField: "vehicleId",
      foreignField: "_id",
      as: "carDetails"
  }},
  {$lookup: {
      from: "bikes",
      localField: "vehicleId",
      foreignField: "_id",
      as: "bikeDetails"
  }},
  {$project: {
     vehicleType: 1,
     vehicleId: 1,      
     vehicleDetails:{$setUnion: [ "$carDetails", "$bikeDetails" ]}
  }},
  {$project: {
      carDetails:0,
      bikeDetails:0,
  }}
]);

否则你需要使用$facet在查找之前按类型过滤车辆:

db.vehicles.aggregate([
   {
     $facet: {
         "cars": [
            {$match: {"vehicleType": "cars"}},
            {$lookup: {
               from: "cars",
               localField: "vehicleId",
               foreignField: "_id",
               as: "vehicleDetails"
             }},
         ],
         "bikes": [
            {$match: {"vehicleType": "bikes"}},
            {$lookup: {
               from: "bikes",
               localField: "vehicleId",
               foreignField: "_id",
               as: "vehicleDetails"
             }}
         ]
     }
   },
   {$project: {all: {$setUnion: ["$cars", "$bikes"]}}},
   {$unwind: "$all"},
   {$replaceRoot: { newRoot: "$all" }}
])

关于mongodb - 如何在 MongoDB $lookup 中使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43103464/

相关文章:

node.js - Mongoose 更新子文档(如果存在)

java - 将具体类对象持久化到数据库时,将抽象类中的字段设置为强制字段

node.js - Express Js 不在 res.json() 上发送错误对象

mongodb - 从聚合中返回整个文档

arrays - 如何删除投影(项目)中值为空的数组元素,mongodb

c++ - 使用 mongocxx 驱动时访问冲突读取位置

MongoDB 通过嵌套字段进行聚合并按另一个字段进行计数

python - MongoDB:如何查找聊天室有电话号码的消息?

mongodb - 如何检查mongo中相同文档中的两个值?

node.js - Mongoose 聚合匹配 objectId 数组