簡単な答え: mongoose.Types.ObjectIdを使用してください 。
Mongoose(mongoではない)はオブジェクトIDを文字列として受け入れ、適切に「キャスト」できるため、次を使用するだけです。
MyClass.findById(req.params.id)
ただし、注意点はreq.params.id
の場合です。 はmongoID文字列の有効な形式ではないため、キャッチする必要のある例外がスローされます。
したがって、理解すべき主な紛らわしいことは、mongoose.SchemaTypes
マングーススキーマとmongoose.Types
を定義するときにのみ使用するものがあります データベースまたはクエリオブジェクトに格納するデータオブジェクトを作成するときに使用するものがあります。したがって、mongoose.Types.ObjectId("51bb793aca2ab77a3200000d")
動作し、データベースに保存したりクエリで使用したりできるオブジェクトを提供し、無効なID文字列が指定された場合は例外をスローします。
findOne
クエリオブジェクトを受け取り、単一のモデルインスタンスをコールバックに渡します。そしてfindById
文字通りfindOne({_id: id})
のラッパーです (ここのソースコードを参照してください)。 find
だけ クエリオブジェクトを受け取り、一致するモデルインスタンスの配列をコールバックに渡します。
ゆっくり行くだけです。紛らわしいですが、この時点で混乱していて、マングースのバグにぶつかっていないことを保証できます。かなり成熟したライブラリですが、コツをつかむには時間がかかります。
スニペットに表示されるもう1つの疑わしい点は、new
を使用していないことです。 ChildClass
をインスタンス化するとき 。それを超えて、残っているCastErrorを追跡できるように、スキーマコードを投稿する必要があります。