11

私は Express を使用しており、この種のオブジェクトを変換する便利な方法を探しています (これはリクエストに応じて提供されますreq.body.myObject)。

{
  "name": "Foo",
  "someNumber": "23",
  "someBoolean": "on"
}

このスキーマのインスタンスに:

var myObjectSchema = new Schema({
    name: String,
    someNumber: Number,
    someBoolean: Boolean
});

最初のオブジェクトはリクエストから取得されるため、完全に文字列によって作成されていることに注意してください。

これを達成するための良い方法はありますか?そうでない場合、この機能をミドルウェアとして実装する方法について何か提案はありますか?

4

3 に答える 3

2

この回答がすでに受け入れられていることは知っていますが、マングースがほとんどのキャスティングを処理することを指摘したいと思います...ほとんどの場合。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...おそらくこれはもう必要ありません。ポイントは、期待する結果が得られない場合は、自分で値をキャストしてみてください。

于 2014-08-26T22:24:46.413 に答える
0

スキーマが静的である場合、理論的には、オブジェクト自体を渡す代わりに、怠惰で洗練されていない方法で値をハードコードすることができます。

var someObject = {
    name: "Foo",
    someNumber: "23",
    someBoolean: "on"
}

var myObjectSchema = new Schema({
    name: someObject.name,
    someNumber: parseInt(someObject.someNumber, 10),
    someBoolean: (someObject.someBoolean == "on")
});

おそらくあなたが探していた答えではないかもしれませんが、より良いものが利用できない場合は考慮すべきものかもしれません.

于 2012-08-21T04:15:20.397 に答える