Запретить Mongoose создавать свойство _id для элементов массива поддокументов

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

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

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


person Atlas    schedule 22.06.2013    source источник


Ответы (6)


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

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);
person throrin19    schedule 22.06.2013
comment
будет ли это пропускать _id поля даже в коллекции subSchema, или только в том случае, когда subSchema используется для встраивания в качестве массива элементов вложенного документа? Я спрашиваю об этом, в частности, из-за моего собственного вопрос по SO сегодня. - person Web User; 01.07.2016
comment
Я использую два уровня вложенных коллекций подсхем. Другими словами, у меня есть коллекция subSchema, аналогичная вашему примеру. В рамках этого я использую другую коллекцию подсхем. Я хочу, чтобы только экземпляры модели подсхемы первого уровня не использовали идентификаторы, но экземпляры модели подсхемы второго уровня (вложенные) должны иметь идентификаторы. Когда я использую ваше решение, то есть указываю { _id: false }, оба уровня подсхемы не имеют идентификаторов. Есть ли способ обойти это поведение? - person Web User; 13.07.2016
comment
А вы пробовали, для третьего уровня выставить { _id : true }? - person throrin19; 13.07.2016
comment
вчера я попробовал изменить это: let studentSchema = new Schema({ studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] }, { _id: false }); на это: let studentSchema = new Schema({ _id: false, id: false, studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] });, и это остановило _id создание studentSchema, но сохранило _id создание объектов в performance массиве вложенных документов. Не уверен, нужны ли и _id: false, и id: false. - person Web User; 13.07.2016

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

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

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

Протестировано в Mongoose v5.9.10

person Joel Grenon    schedule 13.12.2013

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

{
   sub: {
      property1: String,
      property2: String,
      _id: false
   }
}
person wlingke    schedule 28.05.2014

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

{
    _id: ObjectId
    subDocArray: [
      {
        _id: false,
        field: "String"
      }
    ]
}
person jemiloii    schedule 14.10.2016
comment
есть ли способ сделать всю коллекцию уникальной? - person Saitama; 17.01.2018
comment
Наверное, не этим методом, но всегда можно попробовать. _id - это поле, а не ограничение. - person jemiloii; 17.01.2018
comment
если во время создания этого поддокумента я явно назначаю _id = mongoose.Types.ObjectId(), будет ли этот _id уникальным для всей коллекции? - person Saitama; 17.01.2018
comment
просто откройте новое переполнение стека, таким образом вы можете заставить сразу много людей ответить ~ - person jemiloii; 18.01.2018

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

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

},{ _id : false });

or

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

});

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

person Deeksha Sharma    schedule 25.04.2019

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

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

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

delete subSourceSchema.paths._id;

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

person Oliver White    schedule 04.04.2020