web-dev-qa-db-fra.com

Renvoie certains champs avec .populate () de Mongoose

MongoDB me renvoie une valeur JSON après avoir exécuté ma requête. Le problème est que je ne souhaite pas renvoyer tous les fichiers JSON associés à mon retour. J'ai essayé de rechercher la documentation et je n'ai pas trouvé le moyen approprié de le faire. Je me demandais si c'était possible et, dans l'affirmative, quelle était la bonne façon de le faire. Exemple: dans la base de données

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

Quelle serait la bonne façon de retourner un champ s'il existe pour un utilisateur, mais s'il ne renvoie pas un autre champ. Pour l'exemple ci-dessus, je voudrais renvoyer le champ [email][address] Pour RMS et le champ [facebook][address] Pour Zuckerburg. C'est ce que j'ai essayé de rechercher si le champ est nul, mais il ne semble pas fonctionner.

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

Je ne suis pas tout à fait clair sur ce que vous entendez par "retourner un champ", mais vous pouvez utiliser une requête lean() afin de pouvoir modifier librement le résultat, puis remplir les deux champs et post-traiter le résultat. ne gardez que le champ que vous voulez:

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

Si vous souhaitez uniquement renvoyer quelques champs spécifiques pour les documents remplis, vous pouvez le faire en transmettant la syntaxe du nom de champ comme deuxième argument à la méthode peuplée.

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

Voir sélection du champ Mongoose

31

Essayez de faire ceci:

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

Maintenant, ce que vous pouvez faire c'est:

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

Essayez de faire ceci:

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);
}
15
Naveen Kumar

vous pouvez essayer d'utiliser ci-dessous,

 Model
    .find()
    .populate({path: 'foreign_field', ['_id', 'name']}) // only return the Id and Persons name
    ...
0
Naresh Ramoliya

à vous d'essayer:

Post.find({_id: {$nin: [info._id]}, tags: {$in: info.tags}}).sort({_id:-1})
.populate('uid','nm')
.populate('tags','nm')
.limit(20).exec();
0
Tran Hoang Hiep