MongoDB对象类型/嵌套模式

时间:2017-11-22 00:02:32

标签: javascript node.js mongodb

好的,所以我有一个带有eventSchema的events.js文件:

var eventSchema = mongoose.Schema({
name:{
    type: String,
    //required: true
venue:{

}
});

和具有场地架构的venue.js:

var mongoose = require(' mongoose');

var venueSchema = mongoose.Schema(
{
name:{
    type: String,
    //required: true
},
postcode:{
    type: String,
    //required: true
},
town:{
    type: String,
    //required: true
}
});

我的问题是如何才能拥有这样的场所。事件架构中的字段链接到场地架构。因此,当您创建新活动时,您只能从场地列表中添加场地。提前致谢!

2 个答案:

答案 0 :(得分:1)

您可以通过ID链接它。 您不必添加所有场地'事件架构中的字段。

var eventSchema = mongoose.Schema({
  name:{
    type: String,
    //required: true
  },
  venue_id: Schema.Types.ObjectId,
});

由于你使用的是Mongoose,你可以创建像

这样的字段
venue_id: { type: Schema.Types.ObjectId, ref: 'Venue' }

使用datatype方法。

人口是使用来自其他集合的文档(即文档)自动替换文档中指定路径(即venue_id)的过程与venue_id匹配。

您可以像

一样使用它
event.
  findOne({ name: 'somename' }).
  populate('venue').
  exec(function (err, event) {
    if (err) return handleError(err);
});

它将返回带有与venue_id匹配的场地文档的事件doc,而不仅仅是venue_id。

答案 1 :(得分:0)

@godsnam给出的答案是正确的,但是当你想在模式中使用引用时。如果您不想使用引用,那么这可能会对您有所帮助。

您可以在eventSchema中链接您的venueSchema,只需写下如下。

var venueSchema = mongoose.Schema(
    {
        name: {
            type: String,
            //required: true
        },
        postcode: {
            type: String,
            //required: true
        },
        town: {
            type: String,
            //required: true
        }
    });

var eventSchema = mongoose.Schema({
    name: {
        type: String,
        //required: true
    },
    venue: venueSchema
});