Node.js Mongoose使用$lookup包含辅助文档中的字段

Node.js Mongoose使用$lookup包含辅助文档中的字段,node.js,mongodb,mongoose,lookup,Node.js,Mongodb,Mongoose,Lookup,我想显示所有位置,并将订单(如果有)附加到响应中 位置文档示例: { id: "LOCATION_A_OBJECTID", name: "Location A" }, { id: "LOCATION_B_OBJECTID", name: "Location B" }, { id: "LOCATION_C_OBJECTID", name: "Location C" } 订单文档示例: (2个订单给A,1个订单给B,0个订单给C) 预期结果: { id: "LOCATI

我想显示所有位置,并将订单(如果有)附加到响应中

位置文档示例:

{
  id: "LOCATION_A_OBJECTID",
  name: "Location A"
},
{
  id: "LOCATION_B_OBJECTID",
  name: "Location B"
},
{
  id: "LOCATION_C_OBJECTID",
  name: "Location C"
}
订单文档示例: (2个订单给A,1个订单给B,0个订单给C)

预期结果:

{
  id: "LOCATION_A_OBJECTID",
  name: ...
  products: ...
   ...
},
{
  id: "LOCATION_B_OBJECTID",
  name: ...
  products: ...
  ...
}
...
编辑 我会在这里发布我的模式,因为有些地方不对劲

顺序模式

const mongoose = require('mongoose')

const orderSchema = mongoose.Schema({
  location: {
    type: mongoose.Schema.Types.ObjectId
  },
  timestamp: {
    type: Date, default: Date.now
  },
  status: Number,
  products: Array,
  total:   Number
})

module.exports = mongoose.model('Order', orderSchema)
位置架构:

const mongoose = require('mongoose')

const locationSchema = mongoose.Schema({
  name: String,
  address: String
})

module.exports = mongoose.model('Location', locationSchema)
您需要匹配
名称
位置
字段,然后只需运行
$project
即可获得所需的结果文档格式:

db.Locations.aggregate([
    {
        $lookup: {
            from: "Orders",
            let: { loc_id: "$_id" },
            pipeline: [
                { $match: { $expr: { $eq: [ "$$loc_id", "$_id" ] } } },
                { $project: { _id: 0, products: 1 } }
            ],
            as: "orders"
        }
    },
    {
        $match: { orders: { $ne: [] } }
    },
    {
        $project: {
            _id: 1,
            name: 1,
            products: "$orders.products"
        }
    }
])

对于
A
而言,产品应该是
[1,2,3]
还是
[1,2,3,1,2,3]
?@mickl产品应该是一个数组<代码>[1,2,3],[1,2,3]某些东西在@mickl中不起作用,请注意,在
订单
文档中,
位置
填充了ObjectId。我在
products
键中得到空数组。如果两边都有相同的objectid,那么完全使用您的代码(除了
匹配
(因为出于某种原因,它为我提供了0个位置)应该无关紧要。如果类型不同,则需要进行转换。注意,mango游乐场中的结果并不是返回所有位置。只有那些有订单的。我想要的是-显示所有位置,如果有任何订单-将它们附加到响应中的正确位置。删除
match
解决了这个问题(没有订单的位置是可以的)@Dor请删除
$match
阶段以包括那些订单为空的
哦,天哪,我简直说不出话来。起初我尝试了“订单”,然后我意识到这不是我的模式(“订单”)的名称,但当这也失败时,我开始砸我的头。哦,天哪。谢谢,非常感谢!
db.Locations.aggregate([
    {
        $lookup: {
            from: "Orders",
            let: { loc_id: "$_id" },
            pipeline: [
                { $match: { $expr: { $eq: [ "$$loc_id", "$_id" ] } } },
                { $project: { _id: 0, products: 1 } }
            ],
            as: "orders"
        }
    },
    {
        $match: { orders: { $ne: [] } }
    },
    {
        $project: {
            _id: 1,
            name: 1,
            products: "$orders.products"
        }
    }
])