在定义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)
}