2012-12-13 79 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'); 
} 
相關問題