当前位置: 首页 > 知识库问答 >
问题:

猫鼬-5.3。4-防止对带有字符串的查询强制转换为ObjectId

唐麒
2023-03-14

我试图在用户模型上找到一个基于字符串的令牌。我收到错误:

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
});

我猜mongoose正试图将这个十六进制字符串转换成一个_id值?是否有某种方法可以防止mongoose将字符串强制转换为ObjectId类型

共有1个答案

公良飞尘
2023-03-14

在mongoose中,如果使用findByIdAndUpdate(),则必须提供一个objectID值。因此,在您的情况下,它试图找到一个对象ID,但无法找到,因此您会得到一个错误。更适合您的用例的是findOneAndUpdate()。在这里,您可以自由使用其他参数。

 类似资料:
  • 问题内容: 我试图在猫鼬中指定我的数据库的架构。目前,我这样做: 我创建模式并尝试保存一些数据。 错误: 我根据以下代码编写了此代码:http : //mongoosejs.com/docs/populate.html#gsc.tab=0 我怎样才能解决这个问题? 问题答案: 您引用的猫鼬文档中的示例用于该字段以及其他字段。 我假设他们在示例中这样做是为了证明可以使用其中任何一个。如果未在架构中指

  • 问题内容: 我有一个带有ID号的大型数据框: 这些现在都是字符串。 我想转换为不使用循环-为此我使用。 问题是我的某些行包含无法转换为的脏数据,例如 如何(不使用循环)删除这些类型的事件,以便我可以放心使用? 问题答案: 您需要向功能添加参数: 如果是列: 但非数字会转换为,因此所有值都是。 对于需要转换到一些值,例如,然后转换为: 样品: 编辑:如果使用0.25+大熊猫,则可以使用:

  • 这个问题不难,我已经用自己的方法解决了,但我想听听你的意见,也许有什么方法可以让这成为一个改进的选择?Java 8-11。

  • 今天早上,我试图将LibraryFolder ClasspathContainer插件安装到我的Eclipse(STS 3.6.1)中:每次尝试执行时,安装它都会导致上述错误。 更糟糕的是,我试图从Eclipse Marketplace安装插件,但Eclipse在出现大量错误时开始崩溃,包括JVM崩溃。卸载两个插件都没有修复。我尝试了一个新的工作区和一个空白的Eclipse安装,但最终不得不安装以

  • 问题内容: 熊猫的read_csv()方法将’NA’解释为nan(不是数字),而不是有效的字符串。 在下面的简单情况下,请注意,第1行第2列(基于零的计数)的输出为’nan’而不是’NA’。 sample.tsv (制表符分隔) PDB链SP_PRIMARY RES_BEG RES_END PDB_BEG PDB_EN​​D SP_BEG SP_END 5d8b N P60490 1146 114

  • 我试图反序列化从Web API接收的JSON字符串 然而,它给出了一个错误:无法强制转换或转换系统。字符串到App1。ApiResult