Остановите Mongoose для создания свойства _id для элементов массива вложенных документов

Если у вас есть массивы вложенных документов, Mongoose автоматически создает идентификаторы для каждого из них. Пример:

{
    _id: "mainId"
    subdocArray: [
      {
        _id: "unwantedId",
        field: "value"
      },
      {
        _id: "unwantedId",
        field: "value"
      }
    ]
}

Есть ли способ сказать Mongoose не создавать идентификаторы для объектов в массиве?

8 ответов

Решение

Это просто, вы можете определить это в подсхеме:

var mongoose = require("mongoose");

var subSchema = mongoose.Schema({
    //your subschema content
},{ _id : false });

var schema = mongoose.Schema({
    // schema content
    subSchemaCollection : [subSchema]
});

var model = mongoose.model('tablename', schema);

Вы можете создавать поддокументы без схемы и избегать _id. Просто добавьте _id:false в декларацию под-документа.

var schema = new mongoose.Schema({
   field1:{type:String},
   subdocArray:[{
      _id:false,
      field :{type:String}
   }]
});

Это предотвратит создание поля _id в вашем поддокне. Проверено в Mongoose 3.8.1

Кроме того, если вы используете литеральный синтаксис объекта для указания подсхемы, вы также можете просто добавить _id: false подавить это.

{
   sub: {
      property1: String,
      property2: String,
      _id: false
   }
}

Я использую mongoose 4.6.3, и все, что мне нужно было сделать, это добавить в схему _id: false, нет необходимости создавать подсхему.

{
    _id: ObjectId
    subdocArray: [
      {
        _id: false,
        field: "String"
      }
    ]
}

Вы можете использовать любой из

var subSchema = mongoose.Schema({
//subschema fields    

},{ _id : false });

или же

var subSchema = mongoose.Schema({
//subschema content
_id : false    

});

Проверьте вашу версию мангуста, прежде чем использовать второй вариант

Пример NestJS для тех, кто ищет решение с декораторами

      @Schema({_id: false})
export class MySubDocument {
    @Prop()
    id: string;
}

Ниже приведена дополнительная информация из определений типа схемы Mongoose для idа также _id:

      /**
* Mongoose assigns each of your schemas an id virtual getter by default which returns the document's _id field
* cast to a string, or in the case of ObjectIds, its hexString.
*/
id?: boolean;

/**
* Mongoose assigns each of your schemas an _id field by default if one is not passed into the Schema
* constructor. The type assigned is an ObjectId to coincide with MongoDB's default behavior. If you
* don't want an _id added to your schema at all, you may disable it using this option.
*/
_id?: boolean;

Если вы хотите использовать предопределенную схему (с _id) в качестве субдокумента (без _id), теоретически вы можете сделать следующее:

const sourceSchema = mongoose.Schema({
    key : value
})
const subSourceSchema = sourceSchema.clone().set('_id',false);

Но у меня это не сработало. Итак, я добавил:

delete subSourceSchema.paths._id;

Теперь я могу включить subSourceSchema в свой родительский документ без _id. Я не уверен, что это чистый способ сделать это, но он работает.

В mongoose v.3 теперь у вас есть альтернативный способ создания поддокументов без отношений родителей и детей. И эти подчиненные документы не будут иметь индекс

var mongoose = require("mongoose");

var schema = mongoose.Schema({
  // schema content
subSchema: [{
    firstname: 'sub name',
    lastname: 'last name'
  }]
});

var model = mongoose.model('tablename', schema);
Другие вопросы по тегам