この回答がすでに受け入れられていることは知っていますが、マングースがほとんどのキャスティングを処理することを指摘したいと思います...ほとんどの場合。mongoose がこれを行うのは便利ですが、mongoose の真の動作を抽象化します。たとえば、マングースでは次のようなことができます。
PersonModel.findById("4cdf00000000000000007822", ...);
ただし、データベースに直接 (mongoose を使用せずに) クエリを実行しようとすると、これは機能しません。
PersonCollection.find({_id: "4cdf00000000000000007822"}, ...);
これは、ObjectId が文字列ではなく、オブジェクトであるためです。内部的に、mongoose はその文字列を ObjectId に変換し、データベースに対してクエリを実行して、最終的なクエリが次のようになるようにします。
PersonCollection.find({_id: ObjectId("4cdf00000000000000007822")}, ...);
また、スキーマ内の各パスには「caster」メソッドがあります。これはプライベートな方法ですが、必要なときに非常に便利です。 以下で説明する方法は文書化されておらず、警告なしに変更される可能性があることに注意してください。caster
自己責任で使用してください(怒鳴ってすみません):
// Use PersonModel.schema.paths() to get all paths and loop over them if you want
var key = "name";
var pathObj = PersonModel.schema.path( key );
if( !pathObj ) pathObj = PersonModel.schema.virtualpath( key );
if( !pathObj ) { /* not found: return, continue, exit, whatever */ }
// UNDOCUMENTED: USE AT YOUR OWN RISK
var caster = pathObj.caster || pathObj;
var castedValue = caster.cast( req.body.name );
なぜ私はこれを知っているのですか?集計など、mongo のより高度な機能を使用する場合は、パイプラインを構築するときに独自の値をキャストする必要があるためです。演算子を使用した特定のクエリの値を手動でキャストする必要もありました$in
...おそらくこれはもう必要ありません。ポイントは、期待する結果が得られない場合は、自分で値をキャストしてみてください。