我有一个对象数组。我想在集合中保存某些部分,并引用第二个集合以检索补充数据
收藏集1
statute: [{
_id: { type: ObjectId, ref: "Statute" },
subsection: [{
header: String,
}],
}],
使用 .populate(“ statute._id”,“标题法规”) 我希望得到以下输出:
"statute": [
{
"subsection": [],
"_id": "5c15bcf348549e2aac5e99d3",
"title": 13,
"statute": 103
},
]
但是我收到的输出是
"statute": [
{
"subsection": [],
"_id": {
"_id": "5c15bcf348549e2aac5e99d3",
"title": 13,
"statute": 103
}
},
如何告诉猫鼬根据 statute._id 进行填充,但返回 statute 中的值?
答案 0 :(得分:1)
据我所知,这种方式是不可能的,因为这意味着在架构中添加/覆盖字段,这使得猫鼬无法在点击.save()时知道如何处理这些字段。在这样创建的对象上。
但是,除非结果需要实际的猫鼬对象,否则可以将聚合函数与一些查找+投影魔术配合使用,例如:(您可能必须适应文档结构):>
statute.aggregate([
{ $match : {}},
{ $unwind: '$statute'} // splitting the array into separate fields
{
$lookup: // see https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/
{
from: 'Statute',
localField: '_id',
foreignField: '_id,
as: 'remote_statute'
}
},
{
$project: {
"subsection": '$subsection',
"_id": "$remote_statute._id",
"title": '$remote_statute.title',
"statute": '$remote_statute.statute'
}
}
])
注意:您可能必须添加一个分组阶段,才能将结果合并回一个数组中。如果您不知道法规的确切内容,您还可以查看将应用于填充法规的$replaceRoot函数,但是我觉得这不适合您的用途-情况。
此外,我建议您将_id字段重命名为更具描述性的名称,例如statuteId,因为否则这可能会干扰猫鼬设置的_id字段。