使用{strict:true}

时间:2015-09-11 20:07:27

标签: node.js mongodb mongoose database-schema nosql

我在mongoose中有这两个模式:

预订架构

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

用户架构:

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

这种设计的问题是:

某些预订并非由用户创建 - 在这种情况下,预订中的“创建者”字段将为空。同样,一些用户不一定包含预订 - 他们可能会在以后。

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

如果是这种情况,我必须将“创建者”属性添加到预订模型,并将“预订”属性添加到用户,然后将其保存到数据库。

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

提前致谢。

2 个答案:

答案 0 :(得分:0)

除非某个字段有require:true标志,否则可以将其留空。

如果您的字段未在Mongoose架构中定义但存在于MongoDB的文档中,则您必须使用doc.get('field')而不是doc.field。同样地,为了保存doc.set('field', value)strict:false 将被要求,否则它将不会持续存在。

IMO你应该让你的架构包容而不是排他。 Mongoose只是MongoDB中数据的包装器,它的核心已经是无模式的。

答案 1 :(得分:0)

在您的特定情况下,您可以在不指定“创建者”的情况下创建预订,因为其类型为ObjectId Mongoose将只创建文档并将该字段留空。 user.bookings是一个不同的问题,因为它是一个数组,在这种情况下,Mongoose将始终默认为空数组,即使它在创建文档时未定义。在这种情况下,将空数组留在那里会不会很糟糕?它仍然准确地表示数据,用户根本没有预订,但仍然可以拥有它们。如果你明确不想要预订,那么是的,你要么必须处理strict: false,要么手动$取消/删除文件中的字段。