我有一个包含对象的集合,每个对象都包含多个数组。例如
assmemblies: {
mechanicalItems: [{
mechanicalId: <ObjectId that references the mechanicalitems collection>,
quantity: Number
}],
electricalItems: [{
mechanicalId: <ObjectId that references the mechanicalitems collection>
quantity: Number
}],
我正在尝试执行查找,以将机械项目和电气项目中的所有字段放入组件集合中,但很难使 $lookup 工作。
当我尝试展开和分组时,我丢失了另一个数组,或者它最终嵌套在另一个数组的每个数组对象内。
我也尝试直接投影回数量属性,但我得到的是所有数量的数组:
{
$lookup: {
from: "mechanicalitems",
let: {
mechanicalItem: "$mechanicalItems",
item: "$machanicalItems.mechanicalId",
},
pipeline: [
{
$match: {
$expr: {
$in: ["$_id", "$$item"],
},
},
},
{
$project: {
"quantity": "$$mechanicalItem.quantity" // <-- this gives an array of all the quantities
}
},
],
as: "mechanicalItems",
},
},
我尝试了一些其他选项,但无法完全得到我正在寻找的东西。
*** 编辑 - 预期输出
如果我的 MechanicalItems 字段为:“尺寸”、“材料”、“样式”,而我的 ElectricalItems 字段为:“电流”、“额定值”、“绝缘”,那么我的预期输出为:
assemblies: {
mechanicalItems: [{
item: {
_id: <some ObjectId>
size: '12',
material: 'steel',
style: 'thick'
},
quantity: Number
}, ...
],
electricalItems: [{
item: {
_id: <some ObjectId>
current: '15',
rating: 'low voltage',
insulation: 'PVC'
},
quantity: Number
}, ...
]
}
我希望将 MechanicalItemId 替换为 MechanicalItems 集合中的实际对象(并最终将该字段重命名为“item”,但我可以稍后使用 $addFields 或 $project 来做到这一点)。
有一个拼写错误:
$machanicalItems.mechanicalId
,应该是$mechanicalItems.mechanicalId
。
mechanicalItem.quantity
返回一个数字数组,因为 mechanicalItem
是一个数组。相反,您需要获取 quantity
数组的匹配文档的单个 mechanicalItem
值,并将其设置到 quantity
字段。
db.assemblies.aggregate([
{
$lookup: {
from: "mechanicalitems",
let: {
mechanicalItem: "$mechanicalItems",
item: "$mechanicalItems.mechanicalId"
},
pipeline: [
{
$match: {
$expr: {
$in: [
"$_id",
"$$item"
]
}
}
},
{
$set: {
"quantity": {
$first: {
$map: {
input: {
$filter: {
input: "$$mechanicalItem",
cond: {
$eq: [
"$_id",
"$$this.mechanicalId"
]
}
}
},
in: "$$this.quantity"
}
}
}
}
}
],
as: "mechanicalItems"
}
}
])
当您查找与
electricalItems
集合的连接时,electricalItems
数组的逻辑是相同的。