2014-11-01 15 views
30

Mi viene restituito un valore JSON da MongoDB dopo l'esecuzione della mia query. Il problema è che non voglio restituire tutto il JSON associato al mio ritorno, ho provato a cercare i documenti e non ho trovato un modo corretto per farlo. Mi stavo chiedendo cosa sarebbe se fosse possibile, e se sì, qual è il modo corretto di farlo. Esempio: Nel DBRestituire determinati campi con .populate() da Mongoose

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

Quale sarebbe il modo corretto di restituire un campo se esiste per un utente, ma se non restituisce un altro campo. Per l'esempio sopra, vorrei restituire il campo [email][address] per RMS e il campo [facebook][address] per Zuckerburg. Questo è quello che ho cercato di trovare se un campo è nullo, ma non sembra funzionare.

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

risposta

44

Io non sono del tutto chiare su ciò che si intende per "restituire un campo", ma è possibile utilizzare una query lean() in modo che si può liberamente modificare il uscita, quindi popolare entrambi i campi e post-process il risultato per mantenere solo il campo che si desidera:

.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

questo non funziona per me, qualcuno sa se questo è cambiato con un aggiornamento di Mongoose? –

18

provare a fare questo:

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

Se desideri solo alcuni campi specifici per essere restituiti per i documenti popolate, è possibile accompli sh questo passando la sintassi del nome del campo come secondo argomento del metodo populate.

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

Vedi Mongoose populate field selection

+2

Funziona bene. Puoi anche restituire più campi, solo tu devi passare più campi. -> popola ('the_field_to_populate', 'name lastname') – slorenzo

+2

Questa è la risposta più semplice e ha risolto il mio problema. –

+0

E se avessi più di un modello da popolare e volessi i campi per quelli? Come popolare ("post utenti", "nome")? Vuoi ottenere nomi per entrambi? – MoDrags

9

Ora cosa si può fare è:

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

provare a fare questo:

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