如何在mongoose js中嵌套同一模式

3

我正在尝试使用mongoose js嵌套模式,特别是使用相同模式来创建类似树形结构的结构。在这种配置下,一个文档只能有一个父项,但同一个文档可以是多个子项的父项。以下是我最初的方法:

var mongoose = require('mongoose'),
Schema = mongoose.Schema,
ObjectId = Schema.ObjectId;

var mySchema = new Schema({
    _id: {
        type: ObjectId,
        required: true
    },
    parent: {
        _id: { 
            type: ObjectId, 
            ref: 'myModel'
        },
        required: true
    }
});

var myModel = mongoose.model('myModel', mySchema);

module.exports = {
    myModel: mongoose.model('myModel', myModel)
};

然而,当我运行这段代码时,出现了以下错误:

主进程中发生JavaScript错误 未捕获的异常: TypeError: 在文件.required处出现未定义类型"undefined" 您是否尝试使用嵌套模式?您只能使用refs或数组进行嵌套。

我一定是做错了什么。在mongoose js中如何嵌套相同的模式?


请注意,在您的代码示例中,当在module.exports定义内部调用mongoose.model()时,您正在创建模型两次。 - sshow
1个回答

2

警告信息已经提示您“只能使用引用或数组进行嵌套”。这是mongoose的设计。

但您可以尝试以下操作:

var MySchema = new mongoose.Schema({
    objectId: String,
    parent: {
        type: mongoose.Schema.ObjectId,
        ref: 'MySchema'
    },
})

这将使用一个模式中的模式,然后您可以使用“预保存”来更新父级的数据。或者您可以使用参考数组仅保留1个元素。

我所做的是导出模式而不是模型,因此您可以嵌套它。 就像这样:

module.exports = MySchema;

我有一些appModel来设置我的模式集合的模型,就像这样(app_model.js):

if(mongoose.modelNames().indexOf('mySchema') < 0) mongoose.model('mySchema', mySchema);

谢谢,这里的关键是使用模式而不是模型。 - user2497586

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接