1. ホーム
  2. javascript

[解決済み] ある文字列がMongoDBのObjectIDであるかどうかを判断することはできますか?

2022-10-09 15:40:27

質問

文字列を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 validatorは有効な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にキャストすると変化するため、このように動作します。