猫鼬-填充包含其他字段的对象

时间:2018-12-20 18:26:08

标签: mongodb mongoose

我有一个对象数组。我想在集合中保存某些部分,并引用第二个集合以检索补充数据

收藏集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 中的值?

1 个答案:

答案 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字段。