it-swarm.com.ru

Могу ли я определить, является ли строка идентификатором объекта MongoDB?

Я делаю поиски MongoDB путем преобразования строки в BSON. Есть ли способ для меня, чтобы определить, является ли моя строка действительным ObjectID для Mongo, прежде чем делать преобразование?

Вот код для моей текущей функции findByID. Это прекрасно работает, но я бы хотел найти другой атрибут, если я определил, что строка не является идентификатором.

db.collection "pages", (err, collection) ->
  collection.findOne
    _id: new BSON.ObjectID(id)
  , (err, item) ->
    if item
      res.send item
    else
      res.send 404
53
Will

Я обнаружил, что валидатор mongoose ObjectId работает для проверки действительных идентификаторов объектов, но я обнаружил несколько случаев, когда недействительные идентификаторы считались действительными. (например, любая строка длиной 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

Это работает, потому что действительные идентификаторы не изменяются при приведении к ObjectId, но строка, которая получает ложное действительное значение, изменится при приведении к objectId.

72
Andy Macleod

Вы можете использовать регулярное выражение, чтобы проверить это:

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    
}
63
JohnnyHK

Я использовал драйвер нодного узла mongodb, чтобы сделать это в прошлом. Метод isValid проверяет, является ли значение допустимым BSON ObjectId. Смотрите документацию здесь.

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

Вот код, который я написал на основе ответа @ 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;
}
3
nzjoel

mongoose.Types.ObjectId.isValid (string) всегда возвращает True, если строка содержит 12 букв 

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
0
Sajag Porwal

Для 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');
}
0
Om Sharma

Мне потребовалось некоторое время, чтобы найти правильное решение, так как предложенное @Andy Macleod сравнение значения objectId со своей собственной строкой приводило к сбою сервера Express.js на: 

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

Если у вас есть шестнадцатеричная строка, вы можете использовать это:

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

Единственный способ, который я нашел, - это создать новый ObjectId со значением, которое я хочу проверить. Если вход равен выводу, идентификатор действителен:

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