猫鼬-5.3.4-防止强制转换为ObjectId以进行字符串查询

时间:2018-11-26 01:58:23

标签: node.js mongodb express mongoose

我试图在用户模型上findOneAndUpdate使用基于字符串的令牌。和 我收到错误消息:

Cast to ObjectId failed for value "{ passwordResetToken: '4946d72f19b9649d3f306a0f5be59005c884ae453fc049c7',
  passwordResetExpires: { '$gt': 1543196590882 } }" at path "_id" for model "User"

文档的存储方式如下:

{
    "_id": {
        "$oid": "5bfb424da0cc0923f05b67f1"
    },
    "local": {
        "email": "XXXXXXXXXXXXXXXXX",
        "password": "XXXXXXXXXXXXXXXXX"
    },
    "isVerified": false,
    "method": "local",
    "__v": 0,
    "passwordResetExpires": {
        "$date": "2018-11-26T02:41:17.851Z"
    },
    "passwordResetToken": "4946d72f19b9649d3f306a0f5be59005c884ae453fc049c7"
}

查询这样的文档:

req.params.token = "4946d72f19b9649d3f306a0f5be59005c884ae453fc049c7"


User.findByIdAndUpdate({
      'passwordResetToken': req.params.token,
      'passwordResetExpires': { $gt: Date.now() }
    }, 
    {
      'local.password'        : req.body.password,
      'passwordResetExpires'  : null,
      'passwordResetToken'    : null
    }, {new: true})
    .then(user => {
      res.send(user);
    })
    .catch(err => next(err))

这是我当前的架构

var userSchema = mongoose.Schema({
  method: {
    type: String,
    enum: ['local', 'google', 'facebook']
  },
  local: {
    email: {
      type: String,
      lowercase: true
    },
    password: String,
  },
  google: {
    id: String,
    email: {
      type: String,
      lowercase: true
    },
    name: String,
    token: String
  },
  facebook: {
    id: String,
    name: String,
    token: String
  },
  isVerified: {
    type: Boolean,
    default: false,
    required: true
  },
  passwordResetToken: String,
  passwordResetExpires: Date
});

我猜猫鼬正在尝试将此十六进制字符串转换为_id值?有什么方法可以防止猫鼬将字符串转换为ObjectId Type吗?

1 个答案:

答案 0 :(得分:1)

在猫鼬中,如果使用findByIdAndUpdate(),则必须提供一个值为objectID的值。因此,在您的情况下,它将尝试查找对象ID,但找不到,因此会出现错误。更适合您的用例的是findOneAndUpdate()。在这里,您可以自由使用其他参数。