使用猫鼬保存对象后,我可以返回具有字段子集的对象的最简单方法是啥?
Posted
技术标签:
【中文标题】使用猫鼬保存对象后,我可以返回具有字段子集的对象的最简单方法是啥?【英文标题】:After saving an object using mongoose, what is the simplest way I can return an object with a subset of fields?使用猫鼬保存对象后,我可以返回具有字段子集的对象的最简单方法是什么? 【发布时间】:2012-12-21 04:40:34 【问题描述】:我正在使用带有 express 和 node 的猫鼬来创建一个 REST API。保存新对象后,我想将该对象返回给用户。但是,不希望返回一些敏感字段,例如密码、信用卡详细信息、权限、帐单历史记录等。
我认为会有 .select 等效项,您可以在其中仅选择一部分字段以返回给用户。但是,这似乎不存在,并且“标准”只是删除您不想传回给用户的字段,如下所示:
org.save(function(err, org)
if (err) return handleError(err, res);
orgobj = org.toObject();
delete orgobj.__v;
delete orgobj._id;
delete orgobj.billing;
delete orgobj.plans;
delete orgobj.permissions;
return res.send(orgobj);
);
有没有更有效的方法?我不喜欢这样,因为如果随后添加了字段,则必须记住要专门删除它。另外,出于性能原因,我也不想“重新选择”该字段。
【问题讨论】:
【参考方案1】:您可以添加一个方法,getPublicFields
,它返回一个严格包含公共字段的对象。
orgSchema.methods.getPublicFields = function ()
var returnObject =
name: this.name,
address: this.address,
randomField: this.randomField
;
return returnObject;
;
如果您愿意,您还可以向该函数添加回调并执行一些其他查询来聚合数据。方法完成后,调用
var orgPublic = org.getPublicFields();
【讨论】:
完美。工作出色。谢谢!【参考方案2】:如果有人仍然对更友好的猫鼬答案感兴趣,请参阅以下内容。
当您使用 .select(...)
时,您可以看到 mongoose 文档仍然具有其所有字段,而 _doc
属性是要减少的。
您可以在保存新文档后从newDoc['_doc']
中删除您想要的字段。
现在您可以使用newDoc.toObject()
拉取您指定的“公共”字段。
在下面的示例中,我使用_.pick()
为我想要的字段创建白名单,但您也可以使用_.remove()
创建黑名单。
请注意,publicFileds
array 可以在 .select(...)
中用于查询,因此您的 CRUD 操作只需要一个 publicFileds
定义。
var MyModel = require('./MyModel');
var _ = require('lodash');
var publicFileds = ['_id', 'name', 'age'];
function create(newModelData, cb)
var newModle = new MyModel(newModelData);
newModle.save(function (err, newDoc)
if (err)
cb(err);
return;
newDoc['_doc'] = _.pick(newDoc['_doc'], publicFileds);
cb(null, newDoc);
【讨论】:
好吧,如果你真的想要一些实际的技术建议,那么这里使用.select()
的答案(我只是赞成,因为它是唯一正确的一个)实际上只需要添加.lean()
返回甚至少于,而不是您在这里认为的好主意。这确实不是一个好主意,事实上.lean()
是推荐的做法,如果您不需要访问任何对象方法并且只想要一个普通对象。不需要您在此处建议的“跳圈”。以上是关于使用猫鼬保存对象后,我可以返回具有字段子集的对象的最简单方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Express,第二次调用then()函数,用猫鼬保存对象后返回未定义对象