2016-03-22 4 views
2

Bu yüzden, Node'da küçük blog benzeri bir proje yapıyorum ve artık veritabanı referansları ile ilgili bir sorunla karşılaşıyorum. Birbirine referans veren ayrı dosyalarda iki modelim var.MongoDB'de bir artık referans düzgün bir şekilde nasıl silinir?

İşte mankenlerim: Eğer, diyelim ki bir Yayınla silerken

// ./models/user 
Var UserSchema = mongoose.Schema({ 
    name: String, 
    posts: [{type: mongoose.SchemaTypes.ObjectId, ref:'Post'}] 
}); 

// ./models/post 
var PostSchema = mongoose.Schema({ 
    title:String, 
    post_body: String, 
    posted_by: mongoose.SchemaTypes.ObjectId 
}); 

Sorum şu, nasıl Kullanıcı sonrası dizideki referansı silmek istiyorsunuz? Düşüncem, silme rotasından önce çalıştırmak için bir ara katman oluşturabilirdim ve gönderiyi gerçekten silmeden önce kullanıcının yazı dizisindeki referansı silebilirdim. Bu konuda gitmenin en iyi yolu sayılır mı? İşte

// ./models/post 
PostSchema.pre('remove', function(next){ 
    this.model('User').remove({posts: this._id}, next); 
}); 

gerçek yığın post: Automatically remove referencing objects on deletion in MongoDB böyle şemasındaki bir 'ön' fonksiyonunu kullanan Yığın bir yazı buldum. Yine de bu işi alamadım. Bununla birlikte, referansları silmek için özel bir katman yazılımı uyguladım, ancak bunun en iyi uygulama olmadığını düşünüyorum. Herhangi bir ipucu/tavsiye çok takdir edilecektir. Teşekkürler!

cevap

2

Burada .remove() istemiyorum ama bunun yerine $pull ile .update() istiyorum:

bir diziden öğe kaldırmak için doğru bir operasyon
PostSchema.pre('update',function(next) { 
    this.model('User').update(
     { }, 
     { "$pull": { "posts": this._id } }, 
     { "multi": true }, 
     next 
    ); 
}) 

. "Multi", "post" öğesinin referans veren tüm User nesneleri için kaldırılacağından emin olur, muhtemelen bir belgenin gerçekten de olabileceğini düşünür.

.remove() yöntemi, tüm belgeleri "kaldırmak" içindir. .update() yöntemi, belgelere "değişiklik" yapar.

+0

Bunu düşünmediğime inanamıyorum. Güncellemeyi kullanmak tamamen anlam ifade ediyor. Memnun olurum. Şimdi, gönderdiğiniz küçük snippet'i denedim, ancak Object ID hala Kullanıcıların gönderim dizisinin içinde kalıyor. Ön fonksiyonda, hem PostSchema.pre ('update' ... 'hem de PostSchema.pre (' remove '... ') kullandım, ancak referansın kaldırılması yok. – elloM8

+0

Çalışmasını aldım. Görünüşe göre, "kaldır" için sorgu çatalı yok. Dokümanlarda belirtildiği gibi: 'Bir' kaldır 'kancası belirlerseniz, MyModel.remove()' yi aradığınızda değil, myDoc.remove() işlevini çağırdığınızda işlenecektir. Yardımınız için minnettarım, daha önce yaptığımdan çok daha temiz/daha iyi. – elloM8