2013-10-15 23 views
13

के क्षेत्र में मॉडल पर नेस्टेड क्वेरी की जांच की है ऐसा लगता है कि इस विषय पर स्टैक ओवरफ्लो पर बहुत सारे प्रश्नोत्तर हैं, लेकिन मुझे कहीं भी सटीक उत्तर नहीं मिल रहा है।मोंगोस ने संदर्भित मॉडल

मैं क्या है:

मैं कंपनी और व्यक्ति मॉडल:

var mongoose = require('mongoose'); 
var PersonSchema = new mongoose.Schema{ 
         name: String, 
         lastname: String}; 

// company has a reference to Person 
var CompanySchema = new mongoose.Schema{ 
         name: String, 
         founder: {type:Schema.ObjectId, ref:Person}}; 

मैं क्या जरूरत है:

सभी कंपनियों कि lastname "रॉबर्टसन" के साथ लोगों की स्थापना की है का पता लगाएं

मैंने जो कोशिश की:

Company.find({'founder.id': 'Robertson'}, function(err, companies){ 
    console.log(companies); // getting an empty array 
}); 

तो मैं लगा कि व्यक्ति एम्बेडेड नहीं है, लेकिन संदर्भित, तो मैं पॉप्युलेट करने के लिए संस्थापक-व्यक्ति से भरें इस्तेमाल किया और फिर 'रॉबर्टसन' उपनाम के साथ खोजने के उपयोग करने के लिए

// 1. retrieve all companies 
// 2. populate their founders 
// 3. find 'Robertson' lastname in populated Companies 
Company.find({}).populate('founder') 
     .find({'founder.lastname': 'Robertson'}) 
     .exec(function(err, companies) { 
     console.log(companies); // getting an empty array again 
    }); 

मैं अभी भी क्वेरी कर सकता है की कोशिश की स्ट्रिंग के रूप में व्यक्ति की आईडी वाली कंपनियां। लेकिन यह बिल्कुल ठीक नहीं है जैसा कि आप समझ सकते हैं

Company.find({'founder': '525cf76f919dc8010f00000d'}, function(err, companies){ 
    console.log(companies); // this works 
}); 

उत्तर

27

आप इसे एक ही प्रश्न में नहीं कर सकते क्योंकि MongoDB जुड़ने का समर्थन नहीं करता है। इसके बजाय, आप एक जोड़ी चरणों में इसे तोड़ने के लिए है:

// Get the _ids of people with the last name of Robertson. 
Person.find({lastname: 'Robertson'}, {_id: 1}, function(err, docs) { 

    // Map the docs into an array of just the _ids 
    var ids = docs.map(function(doc) { return doc._id; }); 

    // Get the companies whose founders are in that set. 
    Company.find({founder: {$in: ids}}, function(err, docs) { 
     // docs contains your answer 
    }); 
}); 
+0

आप सही हैं, एक संयुक्त कैसा दिखाई देता है कि। मैंने आपको सबसे सरल नेस्टेड क्वेरी दी है जिसे मैं लागू करने के बारे में सोच रहा हूं, शायद यह मामला है जहां डीबी के संबंध अधिक आसान हैं। लेकिन वैसे भी, आपका समाधान काम किया। Thnx! – AzaFromKaza

+0

हैलो, मैं इस जवाब की तलाश कर रहा था क्योंकि मुझे एक ही समस्या है, एक आखिरी सवाल हालांकि, क्या यह बदल गया है या क्या यह अब mongoose 3.8.5 पर संभव है? मुझे एहसास हुआ क्योंकि इस सवाल को पोस्ट किया गया था, मोंगोस ने कुछ संस्करणों को ऊपर उठाया। – maumercado

+0

@maumercado नहीं, यह नहीं बदला है, और इसकी संभावना नहीं है। – JohnnyHK

1

मामले में किसी को भी और अधिक हाल के दिनों में यह भर आता है, नेवला अब एक सुविधा आबाद कहा जाता है के साथ कार्यक्षमता की तरह शामिल होने का समर्थन करता है।

नेवला प्रलेखन से

:

Story. 
findOne({ title: 'Casino Royale' }). 
populate('author'). 
exec(function (err, story) { 
    if (err) return handleError(err); 
    console.log('The author is %s', story.author.name); 
    // prints "The author is Ian Fleming" 

});

http://mongoosejs.com/docs/populate.html

संबंधित मुद्दे