✅ビルドインソリューションisValidObjectId()
>マングース5.7.12
Mongooseを使用している場合は、mongoose組み込みの isValidObjectIdを使用して、文字列が12バイトであるか24文字の16進文字であるかをテストできます。
mongoose.isValidObjectId(string); /* will return true/false */
注意してください!
isValidObjectId()
マングースが無効なオブジェクトIDエラーをスローするのを避けるために、予想されるobjectIDをテストするために最も一般的に使用されます。
例
if (mongoose.isValidObjectId("some 12 byte string")) {
return collection.findOne({ _id: "some 12 byte string" })
// returns null if no record found.
}
期待されるobjectIDが有効かどうかを条件付きでテストしない場合は、エラーをキャッチする必要があります。
try {
return collection.findOne({ _id: "abc" })
//this will throw error
} catch(error) {
console.log('invalid _id error', error)
}
findOne({ _id: null })
およびfindOne({ _id: undefined })
は完全に有効なクエリであり(エラーをスローしません)、trueisValidObjectId(undefined)
をisValidObjectId(null)
返します。
注2を実行してください!
123456789012はbson文字列のようには見えないかもしれませんが、次のクエリはエラーをスローしないため、完全に有効なObjectIDです。(レコードが見つからない場合はnullを返します)。
findOne({ _id: ObjectId('123456789012')}) // ✅ valid query
313233343536373839303132は、24文字の文字列( 123456789012の16進値)のように見える場合がありますが、次のクエリはエラーをスローしないため、有効なObjectIdでもあります。(レコードが見つからない場合はnullを返します)
findOne({ _id: ObjectId('313233343536373839303132')}) // ✅ valid query
以下は無効です(上記の例より1文字少ない文字)
findOne({ _id: ObjectId('12345678901')}) // ❌ not 12 byte string
findOne({ _id: ObjectId('31323334353637383930313')}) // ❌ not 24 char hex
ObjectIdの形式
ObjectIdは小さく、おそらく一意であり、生成が速く、順序付けられています。ObjectId値の長さは12バイトで、次のもので構成されます。
- Unixエポックからの秒数で測定されたObjectIdの作成を表す4バイトのタイムスタンプ値
- プロセスごとに1回生成される5バイトのランダム値。このランダムな値は、マシンとプロセスに固有です。
- ランダムな値に初期化された3バイトのインクリメントカウンター
上記のランダムな値のため、ObjectIdを計算できません。12バイトの文字列または24文字の16進文字列としてのみ表示されます。