从Mongoose文档实例中删除属性

11

我需要从mongoose文档实例中删除一个属性。我找到了很多关于如何从数据库中删除它的问题,但这不是我要找的。

我需要拉下文件,包括一个字段来检查安全访问,然后想剥离该字段,以免在下游代码决定调用 toObject()并将对象发送回客户端时披露该字段。

有什么想法吗?

3个回答

10

我需要从文档实例中删除密码属性,但在API文档中没有找到任何相关内容。这是我所做的:

doc.set('password', null); // doc.password is null

然后我发现您也可以这样做:

delete doc._doc.password // doc.password is undefined

我也想到了 delete doc._doc.password。唯一的问题是这会破坏保存文档的功能,而这是我需要的功能。目前我只是忽略它,等有时间再找更好的解决方案。 - joshperry
1
由于您的模式期望属性为字符串而获取未定义,因此它会导致保存失败。请尝试更新而不是保存。 - sergeyz
1
删除方法不起作用。当您调用doc.save()时,它不会从数据库中删除该字段。您需要执行- doc.set('password', undefined); 编辑:我认为这实际上是OP想要的 - 他希望doc的下游持有者无法看到password字段,但似乎并不希望该字段实际上从数据库中被删除。 - Kip

8

从版本2.4开始,您可以执行以下操作:

doc.field = undefined;
await doc.save();

这将从本质上来说$unset该字段


这适用于保存新文档,但是对于更新,我该怎么做? - JuanDa237
这样设置 _id 为 undefined 是无效的。 - Gökhan Polat
我认为因为 _id 是一个特殊属性,所以不行,可能行不通。我建议使用 toObject() 创建文档的副本并对其进行操作。如果我们想要克隆一个对象,这就是我们使用的方法,从你的描述中听起来你可能正在尝试这样做。 - Adam Reis

1
使用值为nullset函数将简单地分配该值,而不是移除它。最好先使用toObject()将文档转换为普通对象,进行更改,然后将其恢复为模型文档。
let tempDoc = doc.toObject();
delete tempDoc.password;
doc = new this(tempDoc);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接