2011-12-17 20 views
17

मैं अपने अनुप्रयोग के लिए एक लॉग कीपर के रूप में MongoDB उपयोग कर रहा हूँ तो उस पर मोबाइल ग्राहकों सिंक आबाद।नेवला: एक आबादी वाले क्षेत्र

var UserArticle = new Schema({ 
    date: { type: Number, default: Math.round((new Date()).getTime()/1000) }, //Timestamp! 
    user: [{type: Schema.ObjectId, ref: "User"}], 
    article: [{type: Schema.ObjectId, ref: "Article"}], 
    place: Number,  
    read: Number,  
    starred: Number, 
    source: String 
}); 
mongoose.model("UserArticle",UserArticle); 

var Log = new Schema({ 
    user: [{type: Schema.ObjectId, ref: "User"}], 
    action: Number, // O => Insert, 1 => Update, 2 => Delete 
    uarticle: [{type: Schema.ObjectId, ref: "UserArticle"}], 
    timestamp: { type: Number, default: Math.round((new Date()).getTime()/1000) } 
}); 
mongoose.model("Log",Log);

जब मैं लॉग मैं follwing कोड का उपयोग पुनर्प्राप्त करना चाहते हैं:


var log = mongoose.model('Log'); 
log 
.where("user", req.session.user) 
.desc("timestamp") 
.populate("uarticle") 
.populate("uarticle.article") 
.run(function (err, articles) { 
if (err) { 
    console.log(err); 
     res.send(500); 
    return; 
} 
res.json(articles); 

आप देख सकते हैं, मैं नेवला को भरने के लिए चाहते हैं "uarticle" मैं इस मॉडल NodeJS में स्थापित है लॉग संग्रह से फ़ील्ड और फिर, मैं UserArticle ("uarticle") के "आलेख" फ़ील्ड को पॉप्युलेट करना चाहता हूं।

लेकिन, इस कोड का उपयोग, नेवला केवल "uarticle" UserArticle मॉडल का उपयोग कर, लेकिन नहीं लेख क्षेत्र uarticle के अंदर भरता है।

यह नेवला का उपयोग कर इसे पूरा करने के लिए और पॉप्युलेट() या मैं कुछ और करना चाहिए संभव है?

मैं क्या दस्तावेज में देख लिया है से धन्यवाद,

+0

मैं एक ही समस्या है, जहां संदर्भ में अंतर्निहित है आई है का उपयोग किए बिना किया जा सकता है एक सरणी -> myList: [{mid: {type: Schema.ObjectId, 'ref': 'OtherModel'}, मेटा: [स्ट्रिंग]}]। जब मैं कोशिश करता हूं तो यह निम्न त्रुटि उत्पन्न करता है .populate ('myList.mid') ... TypeError: अपरिभाषित – Greg

उत्तर

16

और मैं क्या तुम से सुनने से, यह लक्ष्य प्राप्त नहीं किया जा सकता है, लेकिन आप कॉलबैक फ़ंक्शन में "uarticle.article" दस्तावेजों खुद को पॉप्युलेट कर सकते हैं।

हालांकि मैं एक और पहलू है जो मैं और अधिक महत्वपूर्ण मानते हैं का कहना चाहते हैं। आपके पास संग्रह ए में दस्तावेज़ हैं, जिसमें संग्रह संग्रह बी है, और संग्रह बी के दस्तावेजों में आपके पास संग्रह सी में दस्तावेजों का एक और संदर्भ है।

आप या तो यह गलत कर रहे हैं (मैं डेटाबेस संरचना का जिक्र कर रहा हूं), या आपको चाहिए यहां एक MySQL जैसे संबंधपरक डेटाबेस का उपयोग करें। मोंगो डीबी की शक्ति इस तथ्य पर निर्भर करती है कि आप दस्तावेजों में अधिक जानकारी एम्बेड कर सकते हैं, इस प्रकार कम प्रश्न पूछना पड़ता है (एक ही संग्रह में आपका डेटा रखना)। कुछ संदर्भ देने के दौरान ठीक है, एक संदर्भ होने के बाद और फिर एक और संदर्भ ऐसा प्रतीत नहीं होता है कि आप यहां मोंगोडीबी का पूरा लाभ ले रहे हैं।

शायद आप अपनी स्थिति और डेटाबेस संरचना साझा करने के लिए तो हम तुम बाहर अधिक मदद कर सकता है चाहते हैं।

+0

की विधि 'पथ' को कॉल नहीं कर सकता लॉग संग्रह केवल एकमात्र है जिसमें अजीब संदर्भ हैं, मैं बस चाहता था, क्योंकि अन्य केवल 1 संदर्भ है (एक ही डेटा को कई बार दोहराने से बचने के लिए)। मुझे लगता है कि बहुत सारी जानकारी का उपयोग करने से बचने के लिए, मैं इसे "यूर्टिकल" नहीं बनाऊंगा और ग्राहक केवल चीजों को सरल और तेज़ रखने के लिए अनुच्छेद के विवरण प्राप्त करने का अनुरोध करेगा। – Francesc

+1

क्या आप अपने उत्तर पर अधिक जानकारी दे सकते हैं - क्या मैं इसे सही पढ़ रहा हूं, कि एक संदर्भ भी जांचना चाहिए। मैं बस mongodb में शुरू कर रहा हूँ। आखिरकार, बहुत से रिलेशनल टेबलों में केवल एक विदेशी कुंजी होती है। क्या एम्बेडेड दस्तावेज़ ऑब्जेक्टआईडी रेफरी को पॉप्युलेट करने के लिए बेहतर हैं? – grantwparks

+0

यह वास्तव में प्रोजेक्ट की संरचना पर निर्भर करता है, कभी-कभी आप गति के लिए डेटा (एम्बेड) को डुप्लिकेट भी करना चाहते हैं, अन्य बार आपको शायद इसे संदर्भित करने की आवश्यकता हो, क्योंकि उस डेटा को केवल कुछ स्थितियों में ही पूछताछ की जाएगी। – alessioalex

0

की तरह कुछ के बारे में कैसे:

populate_deep = function(type, instance, complete, seen) 
{ 
    if (!seen) 
    seen = {}; 
    if (seen[instance._id]) 
    { 
    complete(); 
    return; 
    } 
    seen[instance._id] = true; 
    // use meta util to get all "references" from the schema 
    var refs = meta.get_references(meta.schema(type)); 
    if (!refs) 
    { 
    complete(); 
    return; 
    } 
    var opts = []; 
    for (var i=0; i<refs.length; i++) 
    opts.push({path: refs[i].name, model: refs[i].ref}); 
    mongoose.model(type).populate(instance, opts, function(err,o){ 
    utils.forEach(refs, function (ref, next) { 
     if (ref.is_array) 
     utils.forEach(o[ref.name], function (v, lnext) { 
      populate_deep(ref.ref_type, v, lnext, seen); 
     }, next); 
     else 
     populate_deep(ref.ref_type, o[ref.name], next, seen); 
    }, complete); 
    }); 
} 

मेटा utils किसी न किसी तरह है ... चाहते src?

5

ऐसा करने के लिए mongoose-deep-populate प्लगइन का उपयोग कर सकते हैं। उपयोग:

User.find({}, function (err, users) { 
    User.deepPopulate(users, 'uarticle.article', function (err, users) { 
     // now each user document includes uarticle and each uarticle includes article 
    }) 
}) 

अस्वीकरण: मैं प्लगइन का लेखक हूं।

1

मैं एक ही समस्या का सामना करना पड़ा है, लेकिन प्रयासों के घंटे के बाद मैं खोजने के solution.It किसी भी बाहरी प्लगइन :)

applicantListToExport: function (query, callback) { 
     this 
     .find(query).select({'advtId': 0}) 
     .populate({ 
      path: 'influId', 
      model: 'influencer', 
      select: { '_id': 1,'user':1}, 
      populate: { 
      path: 'userid', 
      model: 'User' 
      } 
     }) 
    .populate('campaignId',{'campaignTitle':1}) 
    .exec(callback); 
    } 
संबंधित मुद्दे