2014-11-01 14 views
30

Sorgumu çalıştırdıktan sonra MongoDB'den bir JSON değeri alıyorum. Sorun geri dönüş ile ilişkili tüm JSON dönmek istemiyorum, dokümanlar aramayı denedim ve bunu yapmak için uygun bir yol bulamadım. Merak ediyorum, eğer mümkün ise, ve eğer öyleyse, böyle yapmanın doğru yolu nedir? Örnek: Başka bir alanı döndürür etmezse DBBelirli alanları .populate() ile Mongoose'dan döndürme

{ 
    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" 
    } 
} 

yılında bir kullanıcı için varsa bir alan dönen doğru yolu olurdu, ama ne. Yukarıdaki örnek için, RMS için [email][address] alanını ve Zuckerburg için [facebook][address] alanını iade etmek istiyorum. Bir alanın boş olup olmadığını bulmaya çalıştığım şey bu, ama çalışmadığı görülüyor.

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

cevap

44

sana "bir alan dönen" ile ne demek tamamen açık değilim, ama özgürce değiştirebilir böylece bir lean() sorgusu kullanabilirsiniz:

.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"); 
     } 
    } 
    } 
+0

bu benim için çalışıyor, herkes bilir bu değişti etti değilse Mongoose güncellemesi ile mi? –

18

deneyin bunu yapmak

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

sadece birkaç özel alanlar nüfuslu belgeler için iade edilecek istiyorsanız, aşağıdakileri yapabilirsiniz getirmesinden: çıktı, ardından alanları ve sonrası süreç yalnızca istediğiniz alanı tutmak için sonuç her iki doldurmak Bu, alan adı sözdizimini, populate yöntemine ikinci bağımsız değişken olarak ileterek sh.

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

Mongoose populate field selection

+2

İyi çalışıyor. Daha fazla alan da döndürebilirsiniz, sadece daha fazla alan geçmelisiniz. -> doldurun ('the_field_to_populate', 'isim soyadı') – slorenzo

+2

Bu en basit cevap ve sorunumu çözdü. –

+0

Bu alanlar için doldurulması ve aranması için birden fazla modeliniz olsaydı ne olurdu? Populate gibi ('kullanıcılar gönderir', 'isim')? İkisi için isimler alır mısın? Böyle – MoDrags

9

görün Şimdi yapabilecekleriniz:

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

deneyin bunu:

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); 
} 
İlgili konular