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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以确定字符串是否是MongoDB ObjectID吗?相关的知识,希望对你有一定的参考价值。

我通过将字符串转换为BSON来进行MongoDB查找。在进行转换之前,有没有办法让我确定我拥有的字符串是否是Mongo的有效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
答案

我发现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时会更改。

另一答案

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

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

另一答案

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

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。 See the documentation here.

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;
}
另一答案

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

ObjectId.isValid(ObjectId.createFromHexString(hexId));
另一答案

我花了一段时间才得到一个有效的解决方案,因为@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
}
另一答案

对于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');
}
另一答案

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

如果字符串包含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

以上是关于我可以确定字符串是否是MongoDB ObjectID吗?的主要内容,如果未能解决你的问题,请参考以下文章

我如何确定 mongodb 是不是返回空结果

基于gt和lt创建mongodb索引

检测 Object 是不是为 List<String> [重复]

mongodb - 聚合游标计数

将 PouchDB 与 MongoDB 一起使用

函数3