从从MongoDB检索的Javascript对象中删除一个值

时间:2020-03-28 10:13:05

标签: javascript json mongodb

我很清楚这个问题已经被问过多次,但是就我而言,我完全不知道为什么我的特定键值未被删除。

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而言,这只是没有发生。也没有引发任何错误。它与对象类型有关系吗?还是我错过了一些很小且微不足道的东西?

提前谢谢!

2 个答案:

答案 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)

如果定义了例如吸气剂,则删除将无用。

  • 您应该尝试set 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'];