मोंगोज़ से .populate () के साथ कुछ फ़ील्ड लौटाएँ


86

अपनी क्वेरी चलाने के बाद मुझे MongoDB से JSON मान वापस मिल रहा है। समस्या यह है कि मैं अपनी वापसी से जुड़े सभी JSON को वापस नहीं करना चाहता, मैंने डॉक्स की खोज करने की कोशिश की और ऐसा करने का उचित तरीका नहीं खोजा। मैं सोच रहा था कि क्या यह संभव है, और यदि ऐसा करने का उचित तरीका क्या है। उदाहरण: डीबी में

{
    user: "RMS",
    OS: "GNU/HURD",
    bearded: "yes",
    philosophy: {
        software: "FOSS",
        cryptology: "Necessary"
    },
    email: {
        responds: "Yes",
        address: "rms@gnu.org"
    },
    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");
      }
    }
  }

जवाबों:


90

मैं इस बात पर पूरी तरह से स्पष्ट नहीं हूं कि "फ़ील्ड वापस करने" से आपका क्या मतलब है, लेकिन आप एक 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;
    }
  });

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

1
यह मेरे लिए काम नहीं कर रहा है या तो, मैंने कोशिश की .populate('model', 'field'), .populate('model', { field: 1}), .populate('model', [field])के साथ या बिना lean()और के साथ या बिना selectPopulatedPaths: falseमॉडल पर लेकिन मैं हमेशा जवाब में पूर्ण आबादी वाले वस्तु मिला है। प्रलेखन कहता है कि आपका उत्तर सही माना जाता है लेकिन मैं इसे काम नहीं कर सकता। क्या किसी के पास एक ही मुद्दा है?
मेल-मोक

54

यदि आप केवल कुछ विशिष्ट फ़ील्ड को पॉपुलेटेड दस्तावेज़ों के लिए लौटा देना चाहते हैं, तो आप फ़ील्ड नाम सिंटैक्स को पॉप्युलेट विधि के दूसरे तर्क के रूप में पास करके इसे पूरा कर सकते हैं।

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

मानगो पॉप्युलेट फ़ील्ड चयन देखें


8
ठीक काम करता है। आप अधिक फ़ील्ड भी लौटा सकते हैं, केवल आपको अधिक फ़ील्ड पास करना होगा। -> आबाद ('the_field_to_populate', 'नाम lastname')
slorenzo

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

कुछ इस तरह से: Model.findOne ({_ id: 'foo'})। आबाद ({पथ: 'पैरेंट-मॉडल', populate: {path: 'someProperty', populate: {path: 'somePropertyBelow'}})
नॉटिनेशनटबैकअप

28

ऐसा करने की कोशिश करें:

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

26

ऐसा करने की कोशिश करें:

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

1
बस थोड़ा सा समझाने के लिए कि यहां क्या हो रहा है: यह एक नेस्टेड पॉपुलेट और एक साधारण आबादी में फ़ील्ड्स का चयन करना है।
आंद्रे साइमन

आपने मेरा दिन बचा लिया :)
पेशावर एच। अहमद



2

बस ऊपर दिए गए उत्तरों को पूरक करने के लिए, यदि आप सब कुछ शामिल करना चाहते हैं, लेकिन केवल कुछ विशेषताओं को बाहर करते हैं , तो आप निम्न कार्य कर सकते हैं:

.populate('users', {password: 0, preferences: 0})

0

हाय मेरे लिए यह मेरे लिए काम किया मैं आबादी क्षेत्र का उपयोग कर आबादी क्षेत्र: --->

async function displayMessage(req,res,next){
    try{
        let data= await Msg.find().populate("user","userName userProfileImg","User")
               if(data===null) throw "Data couldn ot be loaded server error"
        else {
            res.status(200).json(data)
        }
    }   catch(err){
            next(err)
    }
}

मैं सीधे परिणाम प्राप्त कर रहा हूँ। यहां फ़ील्ड उपयोगकर्ता नाम, userProfile छवि वे हैं जो ive चुनिंदा रूप से आवश्यक हैं और आबादी के लिए सिंटैक्स है: ->

 .populate("user field to populate","fields to display with spaces between each of them " , "modelName ")

प्रत्येक पैरामीटर उलटा अल्पविराम का होना चाहिए।

नीचे आउटपुट है जो मैं पुनः प्राप्त करता हूं। एक और बात आपको पॉपुलेटिंग सब-डॉक्यूमेंट आईडी के बारे में चिंता करने की ज़रूरत नहीं है जो आपको स्वचालित रूप से मिल जाएगी।

[
    {
        "_id": "5e8bff324beaaa04701f3bb9",
        "text": "testing message route",
        "user": {
            "_id": "5e8bf062d3c310054cf9f293",
            "userName": "boss",
            "userProfileImg": "img"
        },
        "__v": 0
    },
    {
        "_id": "5e8bff8dd4368a2858e8f771",
        "text": "testing message route second",
        "user": {
            "_id": "5e8bf062d3c310054cf9f293",
            "userName": "boss",
            "userProfileImg": "img"
        },
        "__v": 0
    },
    {
        "_id": "5e8c0c08e9bdb8209829176a",
        "text": "testing message route second",
        "user": {
            "_id": "5e8bf062d3c310054cf9f293",
            "userName": "boss",
            "userProfileImg": "img"
        },
        "__v": 0
    },
    {
        "_id": "5e8c0e0bcb63b12ec875962a",
        "text": "testing message route fourth time",
        "user": {
            "_id": "5e8bf062d3c310054cf9f293",
            "userName": "boss",
            "userProfileImg": "img"
        },
        "__v": 0
    }
]

0

निम्नलिखित क्वेरी में मैंने उन लेखों को पुनर्प्राप्त किया जो स्थिति show=trueसे मेल खाते हैं जो पुनर्प्राप्त डेटा title and createdAt भी लेख की श्रेणी को केवल श्रेणी के शीर्षक को पुनः प्राप्त करते हैं और यह आईडी है।

let articles = await articleModel
        .find({ show: true }, { title: 1, createdAt: 1 })
        .populate("category", { title: 1, _id: 1 });

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.