我通过将字符串转换为BSON来进行MongoDB查找 . 在进行转换之前,有没有办法让我确定我拥有的字符串是否是Mongo的有效ObjectID?
这是我当前findByID函数的coffeescript . 它工作得很好,但如果我确定字符串不是ID,我想通过不同的属性进行查找 .
db.collection "pages", (err, collection) ->
collection.findOne
_id: new BSON.ObjectID(id)
, (err, item) ->
if item
res.send item
else
res.send 404
10 回答
对于mongoose,使用isValid()函数检查objectId是否有效
示例:
我找到的唯一方法是使用我想要检查的值创建一个新的ObjectId,如果输入等于输出,则id是有效的:
我花了一段时间才得到一个有效的解决方案,因为@Andy Macleod提出的将objectId值与其自己的字符串进行比较的方法正在崩溃Express.js服务器:
我只是用一个简单的try catch来解决这个问题 .
我发现mongoose ObjectId验证器用于验证有效的objectIds,但我发现了一些无效ID被认为有效的情况 . (例如:任何12个字符长的字符串)
为我工作的是将一个字符串转换为objectId,然后检查原始字符串是否与objectId的字符串值匹配 .
这项工作是因为有效ID在转换为ObjectId时不会更改,但获取false有效的字符串在转换为objectId时会更改 .
您可以使用正则表达式来测试:
CoffeeScript的
JavaScript的
我过去曾使用本机节点mongodb驱动程序执行此操作 . isValid方法检查该值是否为有效的BSON ObjectId . See the documentation here.
这是我根据@ andy-macleod的答案编写的一些代码 .
它可以采用int或string或ObjectId,如果传递的值有效则返回有效的ObjectId,如果无效,则返回null:
如果你有十六进制字符串,你可以使用这个:
如果字符串包含12个字母,则mongoose.Types.ObjectId.isValid(string)始终返回True
警告:对于以有效十六进制数字开头的任意12/24长度字符串, isValid 将返回 true . 目前我认为这是一个更好的检查: