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

125

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

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

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

Теги:
mongoose
subdocument

5 ответов

150
Лучший ответ

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

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);
  • 1
    будет ли это пропустить _id поля даже в коллекции подсхемы, или только в том случае , когда подсхемы который используется для встраивания в массив элементов суб-документа? Я спрашиваю об этом, в частности, из-за моего собственного вопроса о SO сегодня.
  • 0
    Я использую два уровня вложенных коллекций подсхем. Другими словами, у меня есть коллекция подсхемы, похожая на ваш пример. В рамках этого я использую другую коллекцию подсхем. Я хочу, чтобы только экземпляры модели подсхем первого уровня не использовали идентификаторы, но экземпляры модели подсхем второго уровня (вложенные) должны иметь идентификаторы. Когда я использую ваше решение, то есть, указав { _id: false } , оба уровня подсхемы не имеют идентификаторов. Есть ли способ обойти это поведение?
Показать ещё 2 комментария
73

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

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

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

21

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

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

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

{
    _id: ObjectId
    subdocArray: [
      {
        _id: false,
        field: "String"
      }
    ]
}
  • 0
    Есть ли способ сделать уникальным для всей коллекции?
  • 0
    Вероятно, не с этим методом, но вы всегда можете попробовать. _id это поле, а не ограничение.
Показать ещё 2 комментария
-2

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню