2015-09-01 25 views
5

İç içe geçmiş belgeyi yinelemeli olarak nasıl değiştirilir Bir MongoDB modelindeki nt düğümüne yinelemeli olarak geçmeye çalışıyorum. İşte benim kullanıcı modelim.MongoDB

Kullanıcı Modeli

var UserSchema = new Schema({ 
    firstname : { type: String}, 
    parents:[{type: mongoose.Schema.Types.ObjectId, ref: 'User' }], 
    children:[{type: mongoose.Schema.Types.ObjectId, ref: 'User' }], 
    partner:[{type: mongoose.Schema.Types.ObjectId, ref: 'User' }], 
    sibling:[{type: mongoose.Schema.Types.ObjectId, ref: 'User' }], 
}); 

olmaz, bu modelden bu nasıl uygulanacağı?, Maket için Mongoose kullanıyorum üzerinde herhangi bir fikir yapısı gibi bir ağaç oluşturmak için biliyorum ve ayrıca Derin ağaç ve popülasyon denedi sadece ilk seviye için çalıştığı gibi çalışmadı.

Teşekkürler.

+2

Doldurulmuş belgenizin bir örneğiniz var mı? – Alex

+0

Bir grup popülasyondan daha fazlasını gerçekleştirmeye çalışmakla ilgili en büyük problem, bir kullanıcının başka bir kullanıcıya atıfta bulunduğu bir “ebeveyn” değerine sahip olması ve kullanıcının ilk kullanıcıya atıfta bulunan bir “çocuk” değerine sahip olmasıdır. Otomatik olarak doldurmayı denerseniz, sonsuz bir döngü oluşturacaksınız. Eğer bir çocukla başlayacak ve tüm ebeveynleri göstermek için ağaca doğru ilerleyecekseniz, o zaman güvende olmalısınız, ancak yanlışlıkla kullanıcı yapmadığınızdan emin olmak için tüm kullanıcı kullanıcılarını izlemeniz gerekir. Bir kullanıcı kendi atalarıdır. –

cevap

4

kolay yolu bu kullanım durumuna bağlı olarak, mavi kuş özellikle vaat, each, props, reduce ve map yöntemlerini kullanmaktır yapmaktır. Senin durumunda

, bunu nasıl gideceğini biliyorum beni Let

var bluebird = require('bluebird'); 
var mongoose = require('mongoose'); 
var UserModel = mongoose.model('User'); 

function getUser(userId) { 
    return UserModel.findOne({_id: userId}).lean().exec() 
    .then(function(user){ 
     return bluebird.props({ 
     firstName: user.firstName, 
     parents: bluebird.map(user.parents, getUser), 
     children: bluebird.map(user.children, getUser), 
     partner: bluebird.map(user.partner, getUser), 
     sibling: bluebird.map(user.sibling, getUser) 
     }) 
    }); 
} 

// Then call getUser once on the root node, e.g. 
getUser(rootUserObjectId) 
    .then(function(userTree){ 
    console.log(userTree) 
    }) 

çizgisinde bir şey önermek istiyorum!

+0

Çok teşekkürler, iyi çalışıyor. –