我很清楚这个问题已经被问过多次,但是就我而言,我完全不知道为什么我的特定键值未被删除。
index.js
router.post('/user', function(req, res, next){
User.findOne({'email': req.body.email}, function(err, user){
//Few Functions here that perform Validation
delete user['password'];
console.log(user);
res.json({'info': user});
});
});
上述方法不会删除密码字段。我什至使用了方法
delete user.password
但是在我的Javascript对象中,该字段仍然存在。我的Javscript对象是JSON对象,具有以下结构:
{
username: 'username1',
desc: 'Hello ! Welcome to your Profile Page. You can edit your Bio whenever you want to.',
verified: true,
_id: id,
firstName: 'FirstName',
lastName: 'LastName',
email: 'email@email.com',
password: 'encryptedPassword',
verifyEmailToken: '',
publicId: 'publicID',
phoneNo: '9xxxxxxxxx',
profileImage: 'example.jpg',
__v: 0
}
我见过
let person = {
name: "Harry",
age: 16,
gender: "Male"
};
delete person.age;
在控制台中,输出如下:
{ name: 'Harry', gender: 'Male' }
但是,就我的MongoDB user
而言,这只是没有发生。也没有引发任何错误。它与对象类型有关系吗?还是我错过了一些很小且微不足道的东西?
提前谢谢!
答案 0 :(得分:0)
__v
可以推断出猫鼬的用法。
请考虑以下示例:
class A {
props = { password: 'fff' }
get password () {
return this.props['password']
}
}
const a = new A()
console.log('haspassword', a.password)
delete a.password
console.log('haspassword', a.password)
如果定义了例如吸气剂,则删除将无用。
user.set('password', undefined)
或直接
user.password = undefined
@ 52d6c6af注意到的编辑 关于delete运算符为何似乎不起作用的更精确信息(例如,在使用猫鼬模型实例时):
如果对象的原型链上存在具有相同名称的属性,则删除后,该对象将使用原型链中的属性(换句话说,删除仅会影响其自身的属性)。
在上述情况下,密码仍然列出,因为密码是在原型上定义的(由于类中的get语法而发生)
使用get时,属性将在实例的原型上定义,而使用Object.defineProperty()时,属性将在应用实例上定义。
答案 1 :(得分:0)
好吧,所以我遍历了MongoDB的查询db.collection.findOne(query, projection)
文档,发现findOne()
方法返回的是文档而不是游标。
您可以参考文档https://docs.mongodb.com/manual/reference/method/db.collection.findOne
因此,我必须将其转换为原始JSON才能进行删除操作。
所以我用
user.toJSON();
然后在有效的对象上使用delete
方法。
例如
let json = user.toJSON();
delete json['password'];
一个人也可以使用toObject()
方法,如下所示:
let json = user.toObject();
delete json['password'];