使用猫鼬保存对象后,我可以返回具有字段子集的对象的最简单方法是啥?

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() 创建黑名单。

请注意,publicFiledsarray 可以在 .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()函数,用猫鼬保存对象后返回未定义对象

具有多个和可选字段的猫鼬查找

mongoose .find() 方法返回具有不需要的属性的对象

无法在用户对象(猫鼬)中保存消息 ID

MySQL日期更改为JPA保存后的昨天日期

猫鼬保存一个空对象