3

マングースで代替サブドキュメント スキーマの配列を持つことは可能ですか?

たとえば、この構成されたシナリオを考えてみましょう: 人のメイン スキーマがあり、タイプ配列の vehicle というフィールドがある場合、サブ ドキュメント スキーマを定義できるようにしたいのですが、各車両タイプ (車、バイク、自転車、バスなど ) :

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);

person スキーマに注意してください。

その人はそれらの車両のいずれかを持つことができますが、各車両のデータは独自のスキーマに対して検証されます。

前もって感謝します

4

2 に答える 2

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);

それがうまくいかない場合は、この SO の質問で説明されているように、 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 に答える