在 findbyid 上使用正则表达式进行猫鼬搜索
Posted
技术标签:
【中文标题】在 findbyid 上使用正则表达式进行猫鼬搜索【英文标题】:mongoose search using regex on findbyid 【发布时间】:2020-08-05 18:40:05 【问题描述】:我需要通过他的mongodb集合的_id
找到一个用户,
需要使用用户 ID 中的前 5 个字符进行搜索
5e9cca
的示例我可以找到集合 ID 5e9cca24beabb96a4caedc35
var id = req.body.id
User.findById( _id : $regex: '^id', $options: 'i' ,
(err, user) =>
if (err)
console.log(err);
res.status(400)
使用这段代码我得到了这个错误:
MongooseError [CastError]: Cast to ObjectId failed for value " _id: '$regex': '^id', '$options': 'i' " at path "_id" for model "User"
PS : 使用洞 id 的搜索正在工作
【问题讨论】:
【参考方案1】:Mongoose 的.findById() 将接收一个字符串,并在内部将字符串转换为ObjectId()
。所以.findById()
是 MongoDB 的原生函数 .findOne()
的一种包装器,它所能接受的只是一个字符串。此外,您不能对_id
字段进行正则表达式搜索,因为它不是string
类型。如果您需要这样做,请尝试以下操作:
在 MongoDB 版本 >4.0 上:
db.collection.aggregate([
/** Create a field of type 'string' from `_id`*/
$addFields: convertedId: $toString: "$_id" ,
/** Regex search against it */
$match:
convertedId:
$regex: "^1a934e",
$options: "i"
,
/** Remove additionally added field */
$project: convertedId: 0
])
测试: mongoplayground
【讨论】:
以上是关于在 findbyid 上使用正则表达式进行猫鼬搜索的主要内容,如果未能解决你的问题,请参考以下文章