22

似乎以这种方式定义我的架构:

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

两者都有效。我看到猫鼬指南使用 Schema.Types.ObjectId

http://mongoosejs.com/docs/schematypes.html

但我很困惑两者都有效。

Schema 应该使用哪一个?两者有什么区别?

4

4 回答 4

13

没关系。两者完全相同。如果您实际上console.log(mongoose.Schema);可以看到两者mongoose.Schema.ObjectIdmongoose.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' } 
}
于 2015-11-12T09:50:19.713 回答
10

文档说:“要指定 ObjectId的类型,请在声明中使用 Schema.Types.ObjectId。”...“或者只是 Schema.ObjectId 以向后兼容 v2”。

所以我使用“Schema.Types.ObjectId”。

于 2017-01-24T16:26:08.170 回答
7

我知道这是一个老话题,但我最近在这个领域遇到了一些麻烦,所以我发现了以下内容,以防其他人撞墙:

每当您在架构中使用对 ObjectId 的引用时,您必须使用 mongoose.Schema.Types.ObjectId。

mongoose.Types.ObjectId 在从十六进制字符串构建新的 objectIds 时应仅用于其构造函数,或者,因为它可能是最常见的用例,将字符串验证为十六进制的 ObjectId,例如:

try {
  let oid = new mongoose.Types.ObjectId('XXXXXXXXX')
} catch (e) {
  console.error('not a valid ObjectId hex string ==> ', e)
}
于 2018-09-28T20:15:05.667 回答
2

没有太大区别,但它们可以单独使用。

架构应始终使用mongoose.Schema.Types.

mongoose.Types是您在 mongoose 文档中使用的对象。这些是特殊的数组子类、缓冲区子类等,我们已经挂钩或创建了特殊的以简化更新和跟踪更改。

来源:https ://github.com/Automattic/mongoose/issues/1671

于 2018-09-05T01:24:00.853 回答