3

是否有可能在猫鼬中有一系列替代子文档模式?

例如,假设这个场景:如果我有一个人的主模式,并且我有一个名为车辆类型数组的字段,我希望能够定义子文档模式,但是对于每种车辆类型(汽车、摩托车、自行车、公共汽车等):

var car = new mongoose.Schema({
    make: { type: String, required: true, default: 'Ford', trim: true },
    model: { type: String, trim: true },
    wheels: Number,
});
var motorbike = new mongoose.Schema({
    make: { type: String, required: true, default: 'Honda', trim: true },
    model: { type: String, trim: true },
    seats: Number,
});
var bike = new mongoose.Schema({
    make: { type: String, required: true, default: 'MuddyFox', trim: true },
    model: { type: String, trim: true },
    lights: Number,
});
var bus = new mongoose.Schema({
    make: { type: String, required: true, default: 'MAN', trim: true },
    model: { type: String, trim: true },
    dents: Number,
});

/* person */
var person = new mongoose.Schema({
    name: { type: String, required: true, default: 'Joe Bloggs', trim: true },
    timeCreated: { type: Date, required: true, default: Date.now },
    vehicles: [car, motorbike, bike, bus] /* this is what i want to do */
});

db.model('person', person);

注意人员模式。

因此,该人可以拥有任何这些车辆,但每辆车的数据仍会根据其自己的模式进行验证。

提前致谢

4

2 回答 2

2

有一个名为 mongoose-schema-extend 的 mongoose 插件,它允许您为 Mongoose 启用模式继承,基本上我认为,您正在寻找这个功能。

请检查 github 项目:

您可以创建一个Vehicle架构,将其作为数组添加到Person架构中,并Vehicle针对您不同类型的车辆进行扩展。

于 2014-10-31T13:19:37.110 回答
1

我找不到作为数组传递的多个嵌入式文档的任何示例。

也许你可以重新调整这样的事情:

var car = new mongoose.Schema({
    make: { type: String, required: true, default: 'Ford', trim: true },
    model: { type: String, trim: true },
    wheels: Number,
});
var motorbike = new mongoose.Schema({
    make: { type: String, required: true, default: 'Honda', trim: true },
    model: { type: String, trim: true },
    seats: Number,
});
var bike = new mongoose.Schema({
    make: { type: String, required: true, default: 'MuddyFox', trim: true },
    model: { type: String, trim: true },
    lights: Number,
});
var bus = new mongoose.Schema({
    make: { type: String, required: true, default: 'MAN', trim: true },
    model: { type: String, trim: true },
    dents: Number,
});

var transport = new mongoose.Schema({
    car: [car],
    motorbike: [motorbike],
    bike: [bike],
    bus: [bus]
});

/* person */
var person = new mongoose.Schema({
    name: { type: String, required: true, default: 'Joe Bloggs', trim: true },
    timeCreated: { type: Date, required: true, default: Date.now },
    vehicles: [transport]
});

db.model('person', person);

如果这不起作用,那么如this SO question中所述,您可以使用mongoose populate在 Mongoose Deep 3.6 中添加了深度种群后,此方法现在更有效 。

所以你可以这样做:

var personSchema = Schema({
  _id     : Number,
  name    : String,
  age     : Number,
  stories : [{ type: Schema.Types.ObjectId, ref: 'Story' }]
});

var storySchema = Schema({
  _creator : { type: Number, ref: 'Person' },
  title    : String,
  fans     : [{ type: Number, ref: 'Person' }]
});

var Story  = mongoose.model('Story', storySchema);
var Person = mongoose.model('Person', personSchema);

还有一个名为mongoose-deep-populate的 mongoose 插件来辅助这个功能,它是最新的。

于 2014-11-06T06:30:12.173 回答