Node.js mongoose使用父字段生成子字段

Node.js mongoose使用父字段生成子字段,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在尝试使用mongodb创建一个家谱网站。在创建一个新的家庭成员时,我只想引用此人的父母(父亲),并让mongoose在person模型中自动生成一个children字段。以下是Person模式: Person.add({ fullName: { type: String, initial:true, required: true,label: , index:true, }, parent: {type: Types.Relationship, ref:'Person'}

我正在尝试使用mongodb创建一个家谱网站。在创建一个新的家庭成员时,我只想引用此人的父母(父亲),并让mongoose在person模型中自动生成一个children字段。以下是Person模式:

Person.add({
    fullName: { type: String, initial:true, required: true,label: , index:true,  },
    parent: {type: Types.Relationship, ref:'Person'},
});
正如您所看到的,在创建一个新的人物时,我希望mongoose能够自动找到人物模型中父id与我正在创建的人物匹配的所有人物,并在children字段中生成一个id数组


我做了一些研究,发现Mongoose Virtuals可以提供类似的功能,但我没有找到任何关于查询模型以添加到虚拟字段的文档。提前谢谢

您可以在
Person
模式模型中创建
post save
钩子,然后
查找具有父id的人员,并
创建/更新该人员的子数组

使用
$addToSet
而不是
$push
,以便不会多次推送相同的孩子

试试这个:

PersonSchema.post('save', function(doc, next) {
    this.findOneAndUpdate({_id : doc.parent},{$addToSet : { children : doc._id}})
    next();
});

有关详细信息,请阅读更多信息。

感谢您的回复!我认为您的解决方案是正确的,但我得到了一个“MongoError:Unknown修饰符:$addtoSet”。你对如何解决这个问题有什么想法吗?我已经更新了答案,它应该加上大写字母“T”,并且它需要一个对象(不是一个值),我也已经更新了。使用最新的代码谢谢!因为我在使用keystone js时,children字段是keystone关系类型,所以我必须传递整个doc
{$addToSet:{children:doc}}
,但我仍然工作:)