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


227

Якщо у вас є масиви субдокументів, Mongoose автоматично створює ідентифікатори для кожного. Приклад:

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

Чи є спосіб сказати Mongoose не створювати ідентифікатори для об’єктів у масиві?

Відповіді:


288

Це просто, ви можете визначити це в підсхемі:

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

2
чи пропустить це _idполе навіть у колекції subSchema, або лише у тому випадку, коли subSchema використовується для вбудовування масиву елементів піддокументу? Я задаю це особливо через моє власне запитання щодо ТА.
Веб-користувач

1
Я використовую два рівні вкладених колекцій підсхем. Іншими словами, у мене є збірка підсхеми, схожа на ваш приклад. У межах цього я використовую іншу колекцію підсхем. Я хочу лише, щоб екземпляри моделі підсхеми першого рівня не використовували ідентифікатори, але екземпляри моделі підкладної схеми другого рівня (вкладені) повинні мати ідентифікатори. Коли я використовую ваше рішення, тобто вказуючи { _id: false }, обидва рівні підсхеми не мають ідентифікаторів. Будь-який спосіб обійти цю поведінку?
Веб-користувач

1
Ви спробували встановити третій рівень { _id : true }?
throrin19

те, що я намагався вчора, було змінити це: 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.
Веб-користувач

Дякую, найкращий спосіб для мене.
Swetabja Hazra

128

Ви можете створювати піддокументи без схеми і уникати _id. Просто додайте _id:falseдо заяви про піддокумент.

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

Це запобіжить створенню _idполя у вашому піддокументі.

Випробуваний у Мангуста v5.9.10


42

Крім того, якщо ви використовуєте об'єктний буквальний синтаксис для визначення підсхеми, ви можете також просто додати його _id: falseдля придушення.

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

26

Я використовую мангусту 4.6.3, і все, що я повинен був зробити, це додати _id: false у схему, не потрібно робити підсхему.

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

чи є спосіб зробити унікальним для всієї колекції?
Сайтама

Напевно, не з цим методом, але ви завжди могли спробувати. _idце поле, а не обмеження.
jemiloii

якщо під час створення цього піддокумента я чітко призначу _id = mongoose.Types.ObjectId(), чи буде тоді _id унікальним для колекції?
Сайтама

просто відкрийте новий переповнення стека, таким чином ви можете змусити людей відповісти одразу ~
jemiloii

4

Ви можете використовувати будь-який із них

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

},{ _id : false });

або

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

});

Перевірте версію мангуста, перш ніж використовувати другий варіант


1

Якщо ви хочете використовувати заздалегідь задану схему (з _id) в якості піддокумента (без _id), ви можете зробити наступне в теорії:

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

Але це не спрацювало для мене. Тому я додав, що:

delete subSourceSchema.paths._id;

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.