あなたは、BSONドキュメントがXMLドキュメントではないという特定のステートメントに正しいです。 XMLは「ノード」で構成されるツリー構造にロードされるため、任意のキーの検索は非常に簡単です。
MonoDBドキュメントは処理がそれほど簡単ではなく、多くの点で「データベース」であるため、「インデックス作成」と検索の両方を容易にするために、データの場所に一定の「均一性」があることが一般的に期待されます。
それにもかかわらず、それは行うことができます。ただし、もちろんこれは、サーバー上で実行される再帰的なプロセスを意味し、 $where
を使用したJavaScript処理を意味します。 。
基本的なシェルの例として、ただし一般的なfunction
$where
への単なる文字列引数です 他のすべてのオペレーター:
db.collection.find(
function () {
var findKey = "find-this",
findVal = "please find me";
function inspectObj(doc) {
return Object.keys(doc).some(function(key) {
if ( typeof(doc[key]) == "object" ) {
return inspectObj(doc[key]);
} else {
return ( key == findKey && doc[key] == findVal );
}
});
}
return inspectObj(this);
}
)
したがって、基本的に、オブジェクトに存在するキーをテストして、目的の「フィールド名」とコンテンツに一致するかどうかを確認します。これらのキーの1つがたまたま「オブジェクト」である場合は、関数に戻って再度検査します。
JavaScript .some()
見つかった「最初の」一致が検索関数から返され、true
が返されることを確認します 結果として、その「キー/値」がある程度の深さで存在していたオブジェクトを返します。
$where
に注意してください 基本的には、コレクションの「インデックス」に適用できる他の有効なクエリフィルタがない限り、コレクション全体をトラバースすることを意味します。
したがって、注意して使用するか、まったく使用せずに、データをより実用的な形式に再構築してください。
しかし、これはあなたにあなたのマッチを与えるでしょう。