Должен ли я использовать Schema.Types.ObjectId или Schema.ObjectId при определении схемы Mongoose

Кажется, что моя схема определяется следующим образом:

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

Но меня смущает, что оба работают.

Какой из них следует использовать для схемы? И в чем разница между ними?


person ek_ny    schedule 11.03.2015    source источник


Ответы (4)


Это не имеет значения. Оба точно такие же. Если вы на самом деле 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' } 
}
person Harunojikan    schedule 12.11.2015

В документации говорится: "Чтобы указать тип ObjectId, используйте Schema.Types.ObjectId в объявлении "..."или просто Schema.ObjectId для обратной совместимости с v2".

Поэтому я использую "Schema.Types.ObjectId".

person Cristian Velásquez    schedule 24.01.2017

Я знаю, что это старая тема, но недавно я столкнулся с некоторыми проблемами в этой области, поэтому вот что я нашел на случай, если кто-то еще стукнется головой о стену:

Всякий раз, когда вы используете ссылку в своей схеме на ObjectId, вы ДОЛЖНЫ использовать mongoose.Schema.Types.ObjectId.

mongoose.Types.ObjectId следует использовать исключительно для его конструктора при создании новых идентификаторов объектов из шестнадцатеричной строки или, как это, вероятно, наиболее распространенный вариант использования, для проверки строки как шестнадцатеричного ObjectId, скажем:

try {
  let oid = new mongoose.Types.ObjectId('XXXXXXXXX')
} catch (e) {
  console.error('not a valid ObjectId hex string ==> ', e)
}
person Felipe Vignon    schedule 28.09.2018

Особой разницы нет, но они доступны для отдельного использования.

Схемы всегда должны использовать mongoose.Schema.Types.

mongoose.Types — это объект, с которым вы работаете в документе мангуста. Это специальные подклассы массивов, подклассы буферов и т. д., которые мы подключили или создали специально для облегчения обновлений и отслеживания изменений.

Источник: https://github.com/Automattic/mongoose/issues/1671

person rqmok    schedule 05.09.2018