Подтвердить что ты не робот

Верните определенные поля с .populate() из Mongoose

Я возвращаю значение JSON из MongoDB после выполнения моего запроса. Проблема в том, что я не хочу возвращать все JSON, связанные с моим возвратом, я пробовал искать документы и не нашел подходящего способа сделать это. Мне было интересно, что, если это возможно, и если да, то каков правильный способ сделать это. Пример: В DB

{
    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] для RMS и поле [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");
      }
    }
  }
4b9b3361

Ответ 1

Я не совсем понимаю, что вы подразумеваете под "возвратом поля", но вы можете использовать запрос 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;
    }
  });

Ответ 2

Если вы хотите получить только несколько определенных полей для заполненных документов, вы можете выполнить это, передав синтаксис имени поля в качестве второго аргумента для метода заполнения.

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

См. Выбор поля заполнения мангуста

Ответ 3

Попробуйте сделать это:

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

Ответ 4

Теперь вы можете сделать следующее:

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

Ответ 5

Попробуйте сделать это:

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

Ответ 6

вам попробовать:

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

Ответ 7

Вы можете попробовать использовать ниже,

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