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"
}
}
])