Mongoose删除对象属性

3

寻找在将对象属性发送到前端之前删除它们的方法。
这个方法有效的原因是什么:

var obj = {
    name: 'cris',
    age: 22,
}
console.log(obj) //output name, age
delete obj.name
console.log(obj) //output age

这个是:

而这个不是:
User.findOne({ username: req.query.username }, function (err, user) {
    if (user != null) {
        console.log(user) //output all props
        delete user.salt || delete user['salt']
        console.log(user) //output all props
    } 
});
4个回答

6

user 是一个 Mongoose 文档,而不是普通的对象。

你可以使用 toObject() 将其转换为普通对象:

user = user.toObject();

2

如果您想使用delete,您需要通过调用toObject将模型文档转换为普通的JavaScript对象:

User.findOne({ username: req.query.username }, function (err, user) {
    if (user != null) {
        console.log(user) //output all props
        user = user.toObject();
        delete user.salt || delete user['salt']
        console.log(user) //remove salt prop
    } 
});

另外,您可以修改使用此功能。

User.findOne({}, function(err, user){
  user.key_to_delete = undefined;
  user.save();
});

如果将属性设置为undefined,然后调用save(),它只会保存对此单个检索实例的更改吗?(即不保存到数据库中的实际文档记录?)编辑我尝试了一下,它确实只影响了检索到的实例(非常酷)。对我来说唯一的问题是我的密码盐字段是必需的,所以当我调用.save()时,它会标记一个验证错误(但仍然返回我的JSON数据,所以我猜一切都好)...我想知道最佳实践是什么..似乎在捕获之后将其转换为toObject()是最好的方法,以将其从mongoose中移除,但我很好奇其他人的想法.. - twknab

0
Mongoose 返回的是模型的实例而不是你要查找的普通 JS 对象。你可以通过使用 user.toObject() 来访问所需的数据。

0

db.collection.findOne() 方法返回一个游标,你需要使用 toObject() 方法将其转换为对象。使用 user.toObject() 然后删除并将其发送给客户端。


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