在Mongoose中使用{strict: true}创建动态模式



我在猫鼬中有这两个模式:

Booking schema

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var bookingSchema = new Schema({
bookingNO:          { type: Number, unique: true},
plateNO:      String,
startDate:    String,
bookedTime:   Number,
creator:      {type: Schema.Types.ObjectId, ref: 'User'}
});
var Booking = mongoose.model('Booking', bookingSchema);

User模式:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var userSchema = new Schema({
username:   String,
password:   String,
balance:    Number,
bookings:   [{type: Schema.Types.ObjectId, ref: 'Booking'}]    
});
var User = mongoose.model('User', userSchema);

这个设计的问题是:

一些预订不是由用户创建的-在这种情况下,预订中的'creator'字段将为空。同样地,一些用户不一定包含一个Booking——他们以后可能会包含。

我正在考虑从2 schema中删除创建者和预订字段,并在Mongoose中使用{strict: false}选项。这是最好的选择吗?

如果是这种情况,我必须将'creator'属性添加到Booking模型,并将' Booking '属性添加到User,然后将其保存到DB中。

最重要的是,由于我已经从Schema中删除了引用,我如何在使用{strict: false}的情况下创建引用?

除非字段有require:true标志,否则可以为空

如果你有一个字段没有在Mongoose模式中定义,但存在于MongoDB的文档中,你必须使用doc.get('field')而不仅仅是doc.field。类似地,对于保存doc.set('field', value)strict:false也需要,否则它将不持久。

在我看来,你应该让你的模式具有包容性而不是排他性。Mongoose只是MongoDB中数据的包装器,其核心已经是无模式的。

在您的特定情况下,您可以创建一个预订而不指定'creator',因为它的类型为ObjectId Mongoose将简单地创建文档并将该字段保留为空。user.bookings是一个不同的问题,因为它是一个数组,在这种情况下,Mongoose将始终默认为一个空数组,即使它在创建文档时未定义。在这种情况下,把空数组留在那里有那么糟糕吗?它仍然准确地表示数据,用户只是没有预订,但仍然有可能预订。如果您明确不想要预订,那么是的,您要么必须处理strict: false,要么手动$unset/删除文档中的字段。

相关内容

最新更新