使用Mongoose的.populate()方法返回特定字段
使用Mongoose的.populate()方法返回特定字段
当我运行查询之后,从MongoDB返回一个JSON值。问题是我不想返回与我的返回关联的所有JSON,我试过搜索文档,但没有找到正确的方法来做到这一点。我想知道是否可能,如果可能的话,正确的做法是什么。例如:\n在数据库中\n
{ user: "RMS", OS: "GNU/HURD", bearded: "yes", philosophy: { software: "FOSS", cryptology: "Necessary" }, email: { responds: "Yes", address: "rms@gnu.org" }, facebook: {} } { user: "zuckerburg", os: "OSX", bearded: "no", philosophy: { software: "OSS", cryptology: "Optional" }, email: {}, facebook: { responds: "Sometimes", address: "https://www.facebook.com/zuck?fref=ts" } }
\n如果用户存在,但字段不存在,则返回另一个字段的正确方法是什么?对于上面的示例,我希望返回RMS的[email][address]
字段和Zuckerburg的[facebook][address]
字段。这是我尝试找到字段是否为空的方法,但似乎不起作用。\n
.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"); } } }
问题的原因是在使用Mongoose的.populate()方法时,想要返回特定的字段,但是没有得到预期的结果。解决方法是在.populate()方法中添加一个select字段来指定要返回的字段。下面是解决问题的代码:
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); }
这段代码的作用是在嵌套的.populate()和简单的.populate()中选择要返回的字段。通过在.populate()方法中添加一个select字段,可以指定要返回的字段,解决了原问题。
问题的原因是,当使用Mongoose的.populate()方法进行数据填充时,有时候只想返回填充文档的特定字段。默认情况下,Mongoose将返回填充文档的所有字段,但有时候只需要返回其中的一部分字段。
解决方法是,在.populate()方法的第二个参数中传入字段名的语法。通过这种方式,可以指定只返回特定的字段。
例如,可以使用以下代码来只返回填充文档的"name"字段:
Model .findOne({ _id: 'bogus' }) .populate('the_field_to_populate', 'name') // 只返回Persons的name字段
如果想要返回更多的字段,只需在第二个参数中传入更多的字段名,如下所示:
Model .findOne({ _id: 'bogus' }) .populate('the_field_to_populate', 'name lastname') // 返回Persons的name和lastname字段
如果需要填充多个模型并且想要返回这些模型的字段,可以使用以下代码:
Model.findOne({_id: 'foo'}).populate({ path: 'parent-model', populate: { path: 'someProperty', populate: { path: 'somePropertyBelow' } } })
通过以上方法,可以解决只返回填充文档的特定字段的需求。更多关于Mongoose的.populate()方法的信息,可以参考Mongoose官方文档中的Mongoose populate field selection部分。
问题的原因是使用`.populate()`方法无法返回指定的字段。解决方法是使用`.lean()`查询来修改输出,然后使用`.populate()`方法来填充字段,并在结果中进行后处理以保留想要的字段。以下是一个示例代码:
.Model.find() .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; } });
某些情况下这个解决方法对他们无效,他们尝试了各种不同的`.populate()`方法的组合,但仍然无法只返回指定的字段。他们怀疑这个问题可能是由于Mongoose的更新导致的。是否有其他人也遇到了相同的问题呢?