在定义Mongoose模式时,我应该使用Schema.Types.ObjectId还是Schema.ObjectId
似乎是这样定义我的模式:在定义Mongoose模式时,我应该使用Schema.Types.ObjectId还是Schema.ObjectId,mongoose,mongoose-schema,Mongoose,Mongoose Schema,似乎是这样定义我的模式: var PossessionSchema = new mongoose.Schema({ thing: {type: mongoose.Schema.Types.ObjectId, ref:"Thing"} }); var PossessionSchema = new mongoose.Schema({ thing: {type: mongoose.Schema.ObjectId, ref:"Thing"} }); 或者这样: var PossessionS
var PossessionSchema = new mongoose.Schema({
thing: {type: mongoose.Schema.Types.ObjectId, ref:"Thing"}
});
var PossessionSchema = new mongoose.Schema({
thing: {type: mongoose.Schema.ObjectId, ref:"Thing"}
});
或者这样:
var PossessionSchema = new mongoose.Schema({
thing: {type: mongoose.Schema.Types.ObjectId, ref:"Thing"}
});
var PossessionSchema = new mongoose.Schema({
thing: {type: mongoose.Schema.ObjectId, ref:"Thing"}
});
两者都有效。我看到mongoose指南使用Schema.Types.ObjectId
但我不明白这两种方法都有效
模式应该使用哪一个?这两者之间有什么区别呢?没关系。两者完全相同。如果您实际上
console.log(mongoose.Schema)
您可以看到mongoose.Schema.ObjectId
和mongoose.Schema.Types.ObjectId
都是指完全相同的东西
{ [Function: Schema]
reserved: {
_posts: 1,
_pres: 1,
validate: 1,
toObject: 1,
set: 1,
schema: 1,
save: 1,
modelName: 1,
get: 1,
isNew: 1,
isModified: 1,
init: 1,
errors: 1,
db: 1,
collection: 1,
once: 1,
on: 1,
emit: 1
},
interpretAsType: [Function],
Types: {
String: { [Function: SchemaString] schemaName: 'String' },
Number: { [Function: SchemaNumber] schemaName: 'Number' },
Boolean: { [Function: SchemaBoolean] schemaName: 'Boolean', '$conditionalHandlers': [Object] },
DocumentArray: { [Function: DocumentArray] schemaName: 'DocumentArray' },
Embedded: [Function: Embedded],
Array: { [Function: SchemaArray] schemaName: 'Array' },
Buffer: { [Function: SchemaBuffer] schemaName: 'Buffer' },
Date: { [Function: SchemaDate] schemaName: 'Date' },
ObjectId: { [Function: ObjectId] schemaName: 'ObjectId' },
Mixed: { [Function: Mixed] schemaName: 'Mixed' },
Oid: { [Function: ObjectId] schemaName: 'ObjectId' },
Object: { [Function: Mixed] schemaName: 'Mixed' },
Bool: { [Function: SchemaBoolean] schemaName: 'Boolean', '$conditionalHandlers': [Object] }
},
ObjectId: { [Function: ObjectId] schemaName: 'ObjectId' }
}
声明中说:“要指定ObjectId的类型,请在声明中使用Schema.Types.ObjectId。”。。。“或仅使用Schema.ObjectId向后兼容v2”
所以我使用“Schema.Types.ObjectId”。没有太大区别,但它们可以单独使用 模式应始终使用
mongoose.Schema.Types
mongoose.Types
是您在mongoose中使用的对象
文件。这些是特殊的数组子类、缓冲区子类等
我们已经连接到或创建了特殊功能,以方便更新和跟踪
变化
资料来源:我知道这是一个老话题,但我最近在这方面遇到了一些麻烦,所以我发现了以下几点,以防有人把头撞到墙上: 无论何时在模式中使用对ObjectId的引用,都必须使用mongoose.schema.Types.ObjectId 当从字符串十六进制构建新的ObjectId时,mongoose.Types.ObjectId应仅用于其构造函数,或者,可能是最常见的用例,将字符串验证为ObjectId十六进制,例如:
try {
let oid = new mongoose.Types.ObjectId('XXXXXXXXX')
} catch (e) {
console.error('not a valid ObjectId hex string ==> ', e)
}