不能在mongoose查询结果上使用“删除”运算符

时间:2018-01-10 22:46:48

标签: javascript node.js mongodb express mongoose

我在将数据发送回浏览器之前尝试删除密钥。出于某种原因,也许是因为它是一个猫鼬对象,这不起作用:

delete myObject.property

如果我console.log(delete myObject.property)我得到true,我理解这意味着该属性未被删除。我该怎样摆脱这把钥匙?

(更多背景:我知道我可以通过使用mongoose select查询来关闭它,但我确实需要最初选择密钥。我也可以将它设置为null,这很好用,但我宁愿得到完全摆脱钥匙)

6 个答案:

答案 0 :(得分:1)

首先将Mongoose文档对象转换为普通的Javascript对象:

const newObj = myObject.toObject();
delete newObj.property;

答案 1 :(得分:1)

正如MikaS所述,您需要转换为首先将Mongoose文档对象转换为普通对象:

const newObj = myObject.toObject();
delete newObj.property;

如果您这样做一次,这应该没问题。但是,如果你必须在任何地方重复这个逻辑,你返回这种类型的文档,省略某些键或其他转换,你应该在你的模式上定义转换:

// specify the transform schema option
if (!schema.options.toObject) schema.options.toObject = {};
schema.options.toObject.transform = function (doc, ret, options) {
  // any kind of simple/complicated transformation logic here
  // remove the _id of every document before returning the result
  delete ret._id;
  return ret;
}

// without the transformation in the schema
doc.toObject(); // { _id: 'anId', name: 'Wreck-it Ralph' }

// with the transformation
doc.toObject(); // { name: 'Wreck-it Ralph' }

阅读文档中的Document#toObject and transformations

答案 2 :(得分:0)

可以在某些版本中使用:

myObject.set('property_to_delete', undefined, {strict: false} );
myObject.save();

答案 3 :(得分:0)

使用lodash pickby方法。 文档:https://lodash.com/docs/#pickBy

答案 4 :(得分:0)

除非属性不可配置,否则

delete返回true。 所以你的密钥确实被删除了。您仍然可以看到密钥,因为在Mongoose文档实例中删除密钥时,它在原型链中可用。

尝试转换:

let Schema = new mongoose.Schema({
  myProperty: String,
  myOtherProperty: String
}, {
  toObject: {
    transform: function (doc, ret) {
      delete ret.myOtherProperty;
    }
  },
  toJSON: {
    transform: function (doc, ret) {
      delete ret.myOtherProperty;
    }
  }
});

答案 5 :(得分:0)

我为自己找到了解决方案,我只是在Schema上创建了一个小助手方法来删除可能的任何字段。

示例用户模式(简体):

const UserSchema = new Schema(
  {
    name: {
      type: String,
      required: true,
      trim: true
    },
    email: {
      type: String,
      required: true,
      trim: true,
    },
    password: {
      type: String,
      required: true,
      trim: true
    },
  },
  {
    timestamps: true
  }
);

const User = mongoose.model("User", UserSchema);
module.exports = User;

出于安全考虑,我喜欢在发送回客户端时从User对象中删除密码盐。我可能会在UserSchema中创建一个辅助方法,例如:

UserSchema.methods.hidePasswordSalt = function() {
  let self = this;
  self = self.toObject();
  if (self.password) {
    delete self.password;
  }
  return self;
};

然后,在我的控制器等中,当我检索User时,我调用该方法并发送结果:

User.findOne({ _id: req.session.userId })
  .then(user => {
    user = user.hidePasswordSalt(); // removes password field
    return res.status(200).json(user);
  })
  .catch(error => {
    return res.status(403).json(error.errors);
  });