我可以确定一个string是否是MongoDB ObjectID?

我正在通过将string转换为BSON来进行MongoDB查找。 有没有一种方法可以让我确定在转换之前,我所拥有的string是否为Mongo的有效ObjectID?

这里是我当前的findByID函数的coffeescript。 它工作的很好,但我想查找一个不同的属性,如果我确定string不是一个ID。

db.collection "pages", (err, collection) -> collection.findOne _id: new BSON.ObjectID(id) , (err, item) -> if item res.send item else res.send 404 

我发现mongoose ObjectIdvalidation工程来validation有效的objectIds,但我发现一些情况下,无效的id被认为是有效的。 (例如:任何12个字符长的string)

 var ObjectId = require('mongoose').Types.ObjectId; ObjectId.isValid('microsoft123'); //true ObjectId.isValid('timtomtamted'); //true ObjectId.isValid('551137c2f9e1fac808a5f572'); //true 

一直在为我工作的是将一个string强制转换为objectId,然后检查原始string是否匹配objectId的string值。

 new ObjectId('timtamtomted'); //616273656e6365576f726b73 new ObjectId('537eed02ed345b2e039652d2') //537eed02ed345b2e039652d2 

这个工作是因为有效的id不会在被转换成ObjectId的时候改变,但是当被转换为objectId的时候会得到一个错误的有效的string。

您可以使用正则expression式来testing:

CoffeeScript的

 if id.match /^[0-9a-fA-F]{24}$/ # it's an ObjectID else # nope 

JavaScript的

 if (id.match(/^[0-9a-fA-F]{24}$/)) { // it's an ObjectID } else { // nope } 

过去,我使用了本地节点mongodb驱动程序来执行此操作。 isValid方法检查该值是否为有效的BSON ObjectId。 请参阅这里的文档。

 var ObjectID = require('mongodb').ObjectID; console.log( ObjectID.isValid(12345) ); 

这里是我写的基于@ andy-macleod的答案的一些代码。

它可以采用int或string或ObjectId,如果传递的值是有效的,则返回一个有效的ObjectId,否则返回null:

 var ObjectId= require('mongoose').Types.ObjectId; function toObjectId(id) { var stringId = id.toString().toLowerCase(); if (!ObjectId.isValid(stringId)) { return null; } var result = new ObjectId(stringId); if (result.toString() != stringId) { return null; } return result; } 

如果你有hexstring,你可以使用这个:

 ObjectId.isValid(ObjectId.createFromHexString(hexId)); 

我花了一段时间才得到一个有效的解决scheme,@Andy Macleod提出的将objectId值与自己的string进行比较的方法是将Express.js服务器崩溃:

 var view_task_id_temp=new mongodb.ObjectID("invalid_id_string"); //this crashed 

我只是用一个简单的尝试来解决这个问题。

 var mongodb = require('mongodb'); var id_error=false; try{ var x=new mongodb.ObjectID("57d9a8b310b45a383a74df93"); console.log("x="+JSON.stringify(x)); }catch(err){ console.log("error="+err); id_error=true; } if(id_error==false){ // Do stuff here } 

对于mongoose,使用isValid()函数来检查objectId是否有效

例如:

 var ObjectId = mongoose.Types.ObjectId; if(ObjectId.isValid(req.params.documentId)){ console.log('Object id is valid'); }else{ console.log('Invalid Object id'); } 

警告:对于以有效hex数字开头的任意12/24长度string, isValid将返回true 。 目前我认为这是一个更好的检查:

((thing.length === 24 || thing.length === 12) && isNaN(parseInt(thing,16)) !== true)