Mongodb Mongoose-填充包含其他字段的对象

Mongodb Mongoose-填充包含其他字段的对象,mongodb,mongoose,Mongodb,Mongoose,我有一个对象数组。我想保存集合中的某些部分,并引用第二个集合来检索补充数据 系列1 statute: [{ _id: { type: ObjectId, ref: "Statute" }, subsection: [{ header: String, }], }], 使用.populate(“法规号”、“产权法规”) 我希望得到以下输出: "statute": [ { "subsection": [], "_id":

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

系列1

statute: [{
    _id: { type: ObjectId, ref: "Statute" },
    subsection: [{
      header: String,
    }],
}],
使用.populate(“法规号”、“产权法规”) 我希望得到以下输出:

"statute": [
    {
        "subsection": [],
        "_id": "5c15bcf348549e2aac5e99d3",
        "title": 13,
        "statute": 103
    },
 ]
但我收到的结果是

"statute": [
        {
            "subsection": [],
            "_id": {
                "_id": "5c15bcf348549e2aac5e99d3",
                "title": 13,
                "statute": 103
            }
        },

如何告诉Mongoose根据规约进行填充。\u id但返回规约中的值?

据我所知,这是不可能的,因为这意味着在模式中添加/覆盖字段,这使得Mongoose在点击.save()时无法知道如何处理这些字段在这样创建的对象上

但是,除非您需要一个实际的mongoose对象,否则您可以将聚合函数与一些lookup+projection魔法结合使用,类似于这样(不过,您可能需要适应您的文档结构):

注意:您可能需要添加一个组阶段来将结果合并回一个数组中。如果您不知道法规的确切字段是什么样子的,您还可以查看应用于填充法规的函数,但我觉得这不适合您的用例

另外,我建议您将_id字段重命名为更具描述性的名称,如statuteId,因为这可能会干扰mongoose设置的_id字段

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'
   }
 }
])