[javascript] 문자열이 MongoDB ObjectID인지 확인할 수 있습니까?

문자열을 BSON으로 변환하여 MongoDB 조회를 수행하고 있습니다. 변환을 수행하기 전에 내가 가지고있는 문자열이 Mongo의 유효한 ObjectID인지 확인할 수있는 방법이 있습니까?

다음은 현재 findByID 함수에 대한 커피 스크립트입니다. 잘 작동하지만 문자열이 ID가 아니라고 판단되면 다른 속성으로 조회하고 싶습니다.

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



답변

몽구스 ObjectId 유효성 검사기가 유효한 objectId의 유효성을 검사하는 것으로 나타 났지만 잘못된 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 valid를 가져 오는 문자열은 objectId로 캐스트 될 때 변경되기 때문에 작동합니다.


답변

정규 표현식을 사용하여 테스트 할 수 있습니다.

CoffeeScript

if id.match /^[0-9a-fA-F]{24}$/
    # it's an ObjectID
else
    # nope

자바 스크립트

if (id.match(/^[0-9a-fA-F]{24}$/)) {
    // it's an ObjectID    
} else {
    // nope    
}


답변

나는 과거에 이것을하기 위해 네이티브 노드 mongodb 드라이버를 사용했다. isValid 메소드는 값이 유효한 BSON ObjectId인지 확인합니다. 여기에서 설명서를 참조하십시오.

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


답변

Mongoose를 사용하는 경우 mongoose 빌트인 isValidObjectId를 사용하여 문자열이 12 바이트인지 아니면 24 진수 문자열인지 테스트 할 수 있습니다 .

mongoose.isValidObjectId (string)는 true / false를 반환합니다.

이것은 승인 된 솔루션에서 제공하는 업그레이드 된 솔루션 입니다.


답변

@ 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;
}


답변

mongoose.Types.ObjectId.isValid (string)은 문자열에 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


답변

내가 찾은 유일한 방법은 확인하려는 값으로 새 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