[英]How to populate the sub-documents returned after aggregate lookup in mongodb?
我在 mongodb 中有以下三个模式。
const A = new Schema({
labelA: String
})
const B = new Schema({
labelB: String
refToA: {Schema.Types.ObjectId, ref: 'A'}
refToCArray: [{Schema.Types.ObjectId, ref: 'C'}]
})
const C = new Schema({
labelC: String
})
我在 A 中运行以下聚合查询以附加一个名为“BCollection”的字段,该字段包含来自 B 的与 A 的 id 匹配的记录。
const ACollection = await A.aggregate([
{ $match: { labelA: 'LabelA1' } },
{
$lookup: {
from: 'B',
localField: '_id',
foreignField: 'refToA',
as: 'BCollection',
},
},
])
我的问题是附加的 B 文档在“refToCArray”字段中包含 C 的 ID。 我想用 C 中的实际内容“填充”或替换这些 ID。 我怎么做。?
例子:
// Documents in A:
{_id: 'A_id1', labelA: 'LabelA1'}
{_id: 'A_id2', labelA: 'LabelA2'}
// Documents in B:
{_id: 'B_id1', labelB: 'LabelB1', refToA: 'A_id1', refToCArray: ['C_id1']}
{_id: 'B_id2', labelB: 'LabelB2', refToA: 'A_id1', refToCArray: ['C_id1']}
{_id: 'B_id3', labelB: 'LabelB3', refToA: 'A_id1', refToCArray: ['C_id1']}
{_id: 'B_id4', labelB: 'LabelB4', refToA: 'A_id2', refToCArray: ['C_id1']}
// Documents in C
C1 {_id: 'C_id1', labelC: 'LabelC'}
上面的查询返回以下内容:
[{
_id: 'A_id1',
labelA: 'LabelA1'
BCollection: [
{_id: 'B_id1', labelB: 'LabelB1', refToA: 'A_id1', refToCArray: ['C_id1']},
{_id: 'B_id2', labelB: 'LabelB2', refToA: 'A_id1', refToCArray: ['C_id1']},
{_id: 'B_id3', labelB: 'LabelB3', refToA: 'A_id1', refToCArray: ['C_id1']}
]
}]
到目前为止,我的查询很好,但 refToCArray 包含 Id 列表:C_id1。 我想得到如下结果:
[{
_id: 'A_id1',
labelA: 'LabelA1'
BCollection: [
{_id: 'B_id1', labelB: 'LabelB1', refToA: 'A_id1', refToCArray: [{_id: 'C_id1', labelC: 'LabelC'}]},
{_id: 'B_id2', labelB: 'LabelB2', refToA: 'A_id1', refToCArray: [{_id: 'C_id1', labelC: 'LabelC'}]},
{_id: 'B_id3', labelB: 'LabelB3', refToA: 'A_id1', refToCArray: [{_id: 'C_id1', labelC: 'LabelC'}]}
]
}]
尝试这个:
db.A.aggregate([
{
$lookup: {
from: "B",
let: { refToA: "$_id" },
pipeline: [
{
$match: {
$expr: { $eq: ["$refToA", "$$refToA"] }
}
},
{
$lookup: {
from: "C",
localField: "refToCArray",
foreignField: "_id",
as: "refToCArray"
}
}
],
as: "BCollection"
}
}
]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.