Верните определенные поля с .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");
}
}
}
Ответы
Ответ 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
...