3

私はMongoosejsを使用してMongoDBに接続しています。

スキーマの次の不自然な例を考えてみましょう。

var factSchema= new Schema({
    facts:  { type:[require('./fact')], select:false}
   ,roles: {type: [String], required: true, index: {unique: false}}
   ,c: {type:  {}, default: {}}  //all calculated stuff based on facts
}

これは、通常「factSchema」をクエリする場合、実際の「ファクト」はクエリされないことを明示的に示しています。'facts'の選択を明示的に実行した後でのみ、それらが含まれていることを確認できます。すなわち:

 //factModel is a model derived from factSchema
 factModel.findOne({_id:input.id})
    .select(["facts","roles","c"]).exec(function(err,result){//do something});

これは、この些細なケースで機能します。ただし、factSchemaをサブクラス化しており(方法に関する情報:https ://groups.google.com/forum/?fromgroups#!searchin / mongoose-orm / INHERIT / mongoose-orm / aeqGRRnpFvg / lbfIA54hiwYJ )、すべてのフィールドをクエリしたい特定のサブクラスの、しかしそれは私がクエリしているサブクラスを実行時にのみ知っています。つまり、返されるフィールドを明示的に指定することはできません。

どうすればいいですか?

考えられる解決策は、(?)であるように思われます。subclassedSchema.pathsここsubclassedSchemaで、のサブクラスを実行することにより、スキーマのすべての定義済みフィールドにアクセスできますfactSchema

これは機能しますが、将来のリリースで安定していると信じることができますか?これに取り組むためのより良い、よりハックの少ない方法はありますか?

4

1 に答える 1

7

2.xブランチにはこれ以上の方法はありません。Schema.pathsは3.xでも変更されていないため、近い将来、これを安全に行うことができます。

3.xには、目的の結果を達成するためにselect呼び出すだけの新しい構文があります。factModel.findOne(..).select('+facts').exec(callback)

于 2012-06-15T20:23:45.493 に答える