Mongoose'un alt belge dizisi öğeleri için _id özelliği oluşturmasını durdurma


227

Alt belge dizileriniz varsa, Mongoose otomatik olarak her biri için kimlikler oluşturur. Misal:

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

Mongoose'a bir dizi içindeki nesneler için kimlik oluşturmamasını söylemenin bir yolu var mı?

Yanıtlar:


289

Çok basit, bunu alt şemada tanımlayabilirsiniz:

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
Bu _id, subSchema koleksiyonunda veya yalnızca subSchema'nın alt belge öğeleri dizisi olarak gömmek için kullanıldığı durumda alanları atlayacak mı? Bunu özellikle bugün SO ile ilgili kendi sorum yüzünden soruyorum .
Web Kullanıcısı

1
İki düzey iç içe alt şema koleksiyonu kullanıyorum. Başka bir deyişle, örneğinize benzer bir subSchema koleksiyonum var. Bunun içinde başka bir alt şema koleksiyonu kullanıyorum. Yalnızca ilk düzey alt şema modeli örnekleri ids kullanmak istiyorum, ancak ikinci düzey (iç içe) alt şema modeli örnekleri id olması gerekir. Çözümünüzü kullandığımda, yani belirtmek gerekirse { _id: false }, her iki alt şema düzeyi de kimliksizdir. Bu davranışa geçici bir çözüm bulmak için herhangi bir yolu var mı?
Web Kullanıcısı

1
Üçüncü seviyenin belirlenmesi için denediniz mi { _id : true }?
throrin19

: ne dün denedim bunu değiştirmek oldu let studentSchema = new Schema({ studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] }, { _id: false });bu: let studentSchema = new Schema({ _id: false, id: false, studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] });ve o durdu _idüzerinde yaratılmasını studentSchemaama muhafaza _idiçinde nesneler üzerinde oluşturulmasını performancealt belgelerin dizisi. Her iki olmadığından emin değil misiniz _id: falseve id: falseihtiyaç vardır.
Web Kullanıcısı

Teşekkürler, benim için en iyi yol.
Swetabja Hazra

128

Şema olmadan alt belgeler oluşturabilir ve bunlardan kaçınabilirsiniz _id. _id:falseAlt belge beyanınıza eklemeniz yeterlidir.

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

Bu, alt _iddoktorunuzda bir alan oluşturulmasını önleyecektir.

Firavun Faresi'nde test edildi v5.9.10


42

Ayrıca, bir alt şemayı belirtmek için bir nesne değişmez sözdizimi kullanırsanız, bunu _id: falsebastırmak için de ekleyebilirsiniz .

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

26

Mongoose 4.6.3 kullanıyorum ve tek yapmam gereken şemada _id: false eklemekti, bir subchema yapmaya gerek yok.

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

koleksiyonun tamamında benzersiz olmanın bir yolu var mı?
Saitama

Muhtemelen bu yöntemle değil, ama her zaman deneyebilirsiniz. _idbir kısıtlama yerine bir alandır.
jemiloii

bu alt belgenin oluşturulması sırasında, açıkça atarsam _id = mongoose.Types.ObjectId(), bu _id koleksiyon boyunca benzersiz olur mu?
Saitama

sadece yeni bir yığın taşması açın, bu şekilde birçok kişi aynı anda cevap alabilirsiniz ~
jemiloii

4

Bunlardan birini kullanabilirsiniz

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

},{ _id : false });

veya

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

});

İkinci seçeneği kullanmadan önce mongoose sürümünüzü kontrol edin


1

Önceden tanımlanmış bir şemayı (_id ile) alt belge olarak (_id olmadan) kullanmak istiyorsanız, teoride aşağıdaki gibi yapabilirsiniz:

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

Ama bu benim için işe yaramadı. Bu yüzden ekledim:

delete subSourceSchema.paths._id;

Şimdi _id olmadan üst belgeme subSourceSchema ekleyebilirim. Bunu yapmanın temiz yolu olduğundan emin değilim, ama işe yarıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.