db.attrs.find(function() {
var attrs = this.attrs;
return Object.keys(attrs).some(function(key) {
return attrs[key].value === "14"
});
})
ここで、ドキュメント内の可能なキーで必要な値を検索することにより、ここでの条件に一致するドキュメントが正しく返されます。
しかし、それは「可能性」についての質問ではありませんが、「これは本当に良いアイデアですか」の1つです。 、基本的な答えは「いいえ」です。
データベースは、インデックスなどで最適化するのが好きな気まぐれな獣であり、検索を可能な限り効率的に使用できるように設定された独自の期待される演算子です。そうです、ブルートフォースが各ドキュメント全体のコード化された状態を効果的に評価する言語通訳を通過するか、デザインパターンを再考することができます。
データベースは「順序」が大好きなので、提案するデータには単純に組織化された再構築があるので、それをいくつか与えてください。
{
"attrs" : [
{ "key": "A1", "type" : "T1", "value" : "13" },
{ "key": "A2", "type" : "T2", "value" : "14" }
]
}
このように整理すると、クエリは次のように簡単になります。
db.attrs.find({ "attrs.value": "14" })
もちろん、配列内のサブドキュメントのこれらのプロパティのインデックスをサポートして使用することもできます。
MongoDBは結局のところ「データベース」であり、すべてのデータベースと同様に、「キー」の名前を使用して検索するのではなく、そのプロパティの「値」に最も関心があります。したがって、意味のある「データ」を表すものは、「キー」の名前の一部ではなく、上記のように「識別子」としての「キー」の「値」である必要があります。
クエリするデータへの一貫したパスを用意することが、MongoDB内のデータを操作するための最適な方法です。キー名が絶えず変化し、実行中のコード以外は通過できない構造を使用すると、非常に遅くなります ネイティブ操作やインデックスなどの機能を使用するよりもパフォーマンスが低下します。