如何使用递归模式引用Mongodb,Mongoose,Express?

时间:2016-06-16 16:10:06

标签: node.js mongodb mongoose mongoose-populate mongoose-schema

使用mongoose和Express与mongodb

所以现在我有一个框架模式,一个框可以包含对象,或者它可以包含其他框:

我的框架模式如下所示:

var box =  new Schema({
    boxId: ObjectId,
    boxContents: [{
        contentType: {
            type: String,
            enum: ["box", "object"]
        },
        typeId: {
            subBox: {
                type: Schema.Types.ObjectId,
                ref: 'box'
            },
            subObject: {
                type: Schema.Types.ObjectId,
                ref: 'object'
            }
        }
    }]
});

我确保我的'ref'标有相应的型号名称,所以我不相信这是问题所在。我像这样创建一个新文档:

var box1 = new Box({
    contents: [{
        contentType: 'object',
        typeId: {
            subObject: object1._id
        }
    }]
});

当我使用时:

Control.find({}).populate('contents.typeId')
.exec(function(error, posts) {
    console.log(JSON.stringify(posts, null, "\t"));
});

它不会填充subBox和subObject字段:(如果我尝试访问subBox或subObject字段,它会给我未定义。 我做错了什么?

1 个答案:

答案 0 :(得分:0)

首先,您需要获得该集合的模型:

var BoxModel = mongoose.connect(dbURI).model("box", box);

boxContents在架构中,但在对象中是内容,应该修改。 要创建要保存的对象,您需要以这种方式使用模型,然后您可以这样获取填充的数据:

var box1 = new BoxModel({
    boxContents: [{
        contentType: 'object',
        typeId: {
            subObject: object1._id
        }
    }]
});


BoxModel.find({}).populate('boxContents.typeId');
OR
BoxModel.find({}).populate({path:'boxContents.typeId'});