mongodb objectid java_我可以确定字符串是否是MongoDB ObjectID吗?

回答(10)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我发现mongoose ObjectId验证器用于验证有效的objectIds,但我发现了一些无效ID被认为有效的情况 . (例如:任何12个字符长的字符串)

var ObjectId = require('mongoose').Types.ObjectId;

ObjectId.isValid('microsoft123'); //true

ObjectId.isValid('timtomtamted'); //true

ObjectId.isValid('551137c2f9e1fac808a5f572'); //true

为我工作的是将一个字符串转换为objectId,然后检查原始字符串是否与objectId的字符串值匹配 .

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

new ObjectId('537eed02ed345b2e039652d2') //537eed02ed345b2e039652d2

这项工作是因为有效ID在转换为ObjectId时不会更改,但获取false有效的字符串在转换为objectId时会更改 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

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

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我过去曾使用本机节点mongodb驱动程序执行此操作 . isValid方法检查该值是否为有效的BSON ObjectId . See the documentation here.

var ObjectID = require('mongodb').ObjectID;

console.log( ObjectID.isValid(12345) );

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

这是我根据@ 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;

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

如果你有十六进制字符串,你可以使用这个:

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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我花了一段时间才得到一个有效的解决方案,因为@Andy Macleod提出的将objectId值与其自己的字符串进行比较的方法正在崩溃Express.js服务器:

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

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

对于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');

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我找到的唯一方法是使用我想要检查的值创建一个新的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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

如果字符串包含12个字母,则mongoose.Types.ObjectId.isValid(string)始终返回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

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值