我能确定一个字符串是MongoDB的对象ID?(Can I determine if a strin

2019-07-05 02:33发布

我通过一个字符串转换为BSON做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

Answer 1:

我发现,猫鼬的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但得到一个错误的有效时铸造到OBJECTID会改变一个字符串有效ID不更改。



Answer 2:

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

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    
}


Answer 3:

我已经使用了本地节点MongoDB的驱动程序来做到这一点过去。 所述的isValid方法检查该值是有效的BSON的ObjectId。 看到这里的文档。

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


Answer 4:

下面是一些代码,我已经根据@安迪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;
}


Answer 5:

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

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


Answer 6:

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

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
}


Answer 7:

对于猫鼬,使用isValid()的函数检查对象ID是否有效

例如:

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


Answer 8:

我发现的唯一方法是创建与我要检查,如果输入等于输出值的新的ObjectId,该ID是有效的:

function validate(id) {
    var valid = false;
    try
    {
        if(id == new mongoose.Types.ObjectId(""+id))
           valid = true;

    }
    catch(e)
    {
       valid = false;
    }
    return valid;
}

> validate(null)
false
> validate(20)
false
> validate("abcdef")
false
> validate("5ad72b594c897c7c38b2bf71")
true


Answer 9:

mongoose.Types.ObjectId.isValid(串)如果字符串包含12个字母总是返回true

let firstUserID = '5b360fdea392d731829ded18';
let secondUserID = 'aaaaaaaaaaaa';

console.log(mongoose.Types.ObjectId.isValid(firstUserID)); // true
console.log(mongoose.Types.ObjectId.isValid(secondUserID)); // true

let checkForValidMongoDbID = new RegExp("^[0-9a-fA-F]{24}$");
console.log(checkForValidMongoDbID.test(firstUserID)); // true
console.log(checkForValidMongoDbID.test(secondUserID)); // false


Answer 10:

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

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



文章来源: Can I determine if a string is a MongoDB ObjectID?