2012-12-13 78 views
40

我正在通过将字符串转换为BSON来进行MongoDB查找。有没有一种方法可以让我在做转换之前确定我所拥有的字符串是否为Mongo的有效ObjectID?我可以确定一个字符串是否是MongoDB 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 
+0

现在,使用try catch块的作品。这是推荐的解决方案吗? – Will

回答

42

我发现,猫鼬的ObjectId验证工作,验证有效的ObjectID但是我发现其中无效IDS被认为是有效的少数病例。 (例如:任何12个字符长的字符串)

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

什么一直为我工作是铸造一个字符串的对象ID,然后检查原始字符串的OBJECTID的字符串值相匹配。

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

这项工作,因为当铸造成的ObjectId但有效身份证件不改变得到一个假的有效时铸造一个对象ID会改变一个字符串。

+0

很好,迄今为止发现的最佳答案。 – Antoine

+0

理论上你可以添加这两个方法来生成一个非常好的ObjectID验证器,将会在今天完成。 – Antoine

56

您可以使用正则表达式来测试为:

的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  
} 
+0

嗯,这也可以匹配non-objectIds,最好的方法是根据规范构建一个验证器,并将它定义为特定的部分,或者尝试创建一个新的objectid并设置一个catch块以捕获它是否可以实现。 – Sammaye

+2

@Sammaye这与[BSON ObjectID构造函数](https://github.com/mongodb/js-bson/blob/master/lib/bson/objectid.js#L15)使用的验证是一样的。你能给我一个它会匹配的非ObjectID字符串的例子吗? – JohnnyHK

+0

哇,我没有看到那个。那么任何有数字和字母的24个字符的字符串,即'lol456712bbfghLLsdfr' – Sammaye

5

我已经使用了本地节点的MongoDB驱动程序在做这个过去。 isValid方法检查该值是否为有效的BSON ObjectId。 See the documentation here.

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

似乎不起作用,以上返回true为一个随机数。 –

-1

警告:的isValid将返回与一个有效的十六进制数字开头任意12/24长度的字符串。 目前,我认为这是一个更好的检查:

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

+1

这将评估为“真正的”“时髦的字符串”。任何长度正确且以十六进制数字开头的字符串都可以满足要求。 – JohnnyHK

1

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

它可以在任何一个int或字符串或的ObjectId,并返回一个有效的ObjectId如果传递的值是有效还是无效,如果它是无效的:

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

如果你有十六进制字符串,你可以这样做:

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

我花了一段时间才能得到有效的解决方案的objectID值与它自己的字符串被撞碎了Express.js服务器上比较提出@Andy麦克劳德的一个:

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

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

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 
} 
0

对于猫鼬,检查使用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'); 
} 
相关问题