如何填充mongodb中聚合查找后返回的子文档? [英] How to populate the sub-documents returned after aggregate lookup in mongodb?
问题描述
我在 mongodb 中有以下三个模式.
I have the following three schemas in 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 匹配的记录.
I run following aggregation query in A to attach a field called 'BCollection' which contains records from B matching the id of A.
const ACollection = await A.aggregate([
{ $match: { labelA: 'LabelA1' } },
{
$lookup: {
from: 'B',
localField: '_id',
foreignField: 'refToA',
as: 'BCollection',
},
},
])
我的问题是附加的 B 文档在 'refToCArray' 字段中包含 C 的 Id.我想用 C 中的实际内容填充"或替换这些 ID.我该怎么做.?
My problem is that the attached B documents contain Id of C in 'refToCArray' field. I want to 'populate' or replace those ids with the actual contents from C. How do I do that.?
示例:
// 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'}
以上查询返回以下内容:
The above query returns the following:
[{
_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.我想得到如下结果:
The query so far i good but refToCArray contains list of Ids: C_id1. I want to get results as below:
[{
_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"
}
}
]);
这篇关于如何填充mongodb中聚合查找后返回的子文档?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!