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

Posted

技术标签:

【中文标题】使用 strict: true 在 Mongoose 中创建动态模式【英文标题】:Creating dynamic schema in Mongoose using strict: true 使用 strict: true 在 Mongoose 中创建动态模式 【发布时间】:2015-12-08 11:32:44 【问题描述】:

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

预订模式

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 选项。这会是最好的选择吗?

如果是这种情况,我必须将“creator”属性添加到 Booking 模型,并将“bookings”属性添加到 User,然后将其保存到数据库中。

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

提前致谢。

【问题讨论】:

【参考方案1】:

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

如果您有一个未在 Mongoose 模式中定义但存在于 MongoDB 文档中的字段,则必须使用 doc.get('field') 而不仅仅是 doc.field。同样,保存doc.set('field', value)strict:false 是必需的,否则它将不会持续存在。

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

【讨论】:

laggingreflex,包容/独占模式是什么意思? 我的意思是包含您认为可能需要的字段,或者您认为将出现在已保存的文档中的字段,而不是排除您认为您可能不经常或将来不需要的字段。除非您设置它们,否则它们实际上不会保存到数据库中。但是,如果您将它们排除在外,并且您需要访问/设置一些实际存在于 MongoDB 文档中的数据,那么您将需要通过 doc.get/set 来访问/设置它们【参考方案2】:

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

【讨论】:

以上是关于使用 strict: true 在 Mongoose 中创建动态模式的主要内容,如果未能解决你的问题,请参考以下文章

ThinkJS连接MongoDB

PHP in_array_r($ needle,$ haystack,$ strict = true);

SyntaxError: Use of const in strict mode.

如何把in_array 的第三个参数strict设置为 true

Mongo:将返回的记录限制为切片的增量计数

cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element