悲しい答えは、MongoDBや他のNoSQLデータベースでよく見られるように、データをできるだけ簡単にクエリできるようにデータを構造化するのがおそらく最善であるということです。
そうは言っても、これを行う方法はいくつかありますが、私が知る限り、JavaScriptサーバー側を実行する必要があります。これは遅くなり、MongoDBのインデックスやその他の論理機能を利用できない可能性があるため、パフォーマンスが非常に重要である場合は、絶対に必要な場合にのみ使用してください。
したがって、これを行う最も簡単な方法は、オブジェクト内のフィールドの数を返す関数を作成することです。これは、$where クエリ構文で使用できます。これにより、データに対して任意のJavaScriptクエリを実行でき、通常の構文クエリと組み合わせることができます。
悲しいことに、私のJavaScript-fuは少し弱いので、JSのオブジェクトのメンバーの数をワンライナーで取得する方法(またはその場合)がわからないので、これを行うために、機能サーバー側。
mongoシェルから、以下を実行します。
db.system.js.save(
{
"_id" : "countFields",
"value" : function(x) { i=0; for(p in x) { i++; } return i}
}
)
countFields
これで、オブジェクト内の要素の数を返す、呼び出されたサーバー側の保存されたJavaScript関数ができました。$where
次に、クエリを使用して検索操作を実行する必要があります。
db.collection.find({
'field_name1': {'$exists': True},
'$where' : 'countFields(this)==2'
})
$exists
これにより、条件と$where
条項の両方を満たすドキュメントのみが提供されます。関数はフィールドとしてcountFields
カウントされるため、例では2と比較していることに注意してください。_id