2014-11-01 11 views
30

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

{ 
    user: "RMS", 
    OS: "GNU/HURD", 
    bearded: "yes", 
    philosophy: { 
     software: "FOSS", 
     cryptology: "Necessary" 
    }, 
    email: { 
     responds: "Yes", 
     address: "[email protected]" 
    }, 
    facebook: {} 
} 

{ 
    user: "zuckerburg", 
    os: "OSX", 
    bearded: "no", 
    philosophy: { 
     software: "OSS", 
     cryptology: "Optional" 
    }, 
    email: {}, 
    facebook: { 
     responds: "Sometimes", 
     address: "https://www.facebook.com/zuck?fref=ts" 
    } 
} 

में एक क्षेत्र लौटने अगर यह एक उपयोगकर्ता के लिए मौजूद है की उचित तरीका क्या हो सकता है, लेकिन अगर यह एक और क्षेत्र वापस नहीं करता है। ऊपर दिए गए उदाहरण के लिए मैं आरएमएस के लिए [email][address] फ़ील्ड और ज़करबर्ग के लिए [facebook][address] फ़ील्ड वापस करना चाहता हूं। यह है कि मैंने यह पता लगाने की कोशिश की है कि कोई फ़ील्ड शून्य है, लेकिन ऐसा लगता है कि यह काम नहीं कर रहा है।

.populate('user' , `email.address`) 
    .exec(function (err, subscription){ 
    var key; 
    var f; 
    for(key in subscription){ 
     if(subscription[key].facebook != null ){ 
      console.log("user has fb"); 
     } 
    } 
    } 

उत्तर

44

मैं तुम्हें द्वारा "एक क्षेत्र लौटने" क्या मतलब है पर पूरी तरह से स्पष्ट नहीं कर रहा हूँ, लेकिन आप एक lean() क्वेरी का उपयोग कर सकते हैं ताकि आप स्वतंत्र रूप से संशोधित कर सकते हैं

.lean().populate('user', 'email.address facebook.address') 
    .exec(function (err, subscription){ 
    if (subscription.user.email.address) { 
     delete subscription.user.facebook; 
    } else { 
     delete subscription.user.email; 
    } 
    }); 
+0

यह मेरे लिए काम कर रहे, किसी को भी जानता है कि अगर यह बदल गया है नहीं एक मोंगोस अपडेट के साथ? –

18

कोशिश यह करने के लिए:

User.find(options, '_id user email facebook').populate('facebook', '_id pos').exec(function (err, users) { 
16

आप केवल चाहते हैं कि कुछ विशिष्ट क्षेत्रों में आबादी वाले दस्तावेज़ों के लिए वापस करने, आप कर सकते हैं accompli: उत्पादन, तो दोनों क्षेत्रों और बाद प्रक्रिया परिणाम केवल क्षेत्र आप चाहते हैं रखने के लिए पॉप्युलेट क्षेत्र के नाम वाक्यविन्यास को पॉप्युलेट विधि के दूसरे तर्क के रूप में पास करके इसे दबाएं।

Model 
.findOne({ _id: 'bogus' }) 
.populate('the_field_to_populate', 'name') // only return the Persons name 
... 

Mongoose populate field selection

+2

ठीक काम करता है। आप और खेतों को भी वापस कर सकते हैं, केवल आपको अधिक फ़ील्ड पास करना होगा। -> populate ('the_field_to_populate', 'name lastname') – slorenzo

+2

यह सबसे आसान जवाब है और मेरी समस्या हल हो गई है। –

+0

क्या होगा यदि आपके पास एक से अधिक मॉडल पॉप्युलेट करना चाहते थे और उन लोगों के लिए फ़ील्ड चाहते थे? पॉप्युलेट की तरह ('उपयोगकर्ता पोस्ट', 'नाम')? क्या आप दोनों के लिए नाम प्राप्त करेंगे? – MoDrags

9

देखें अब आप क्या कर सकते हैं:

.populate('friends', { username: 1, age: 1}) 
7

कोशिश यह करने के लिए:

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); 
}