ネストされた配列の使用における更新の問題のためにこの構造にアプローチしたように見えますが、実際には、実際にはサポートされていない何かを実行することによって別の問題を引き起こしただけです。つまり、"ワイルドカード" 最適な標準のクエリ演算子を使用して未指定のキーを検索するための概念。
このようなデータを実際に検索できる唯一の方法は、サーバーでJavaScriptコードを使用し、 $where
。 ブルートフォースが必要なため、これは明らかにあまり良い考えではありません。 インデックスのような有用なものを使用するのではなく、評価しますが、次のようにアプローチできます。
db.theses.find(function() {
var relations = this.relations;
return Object.keys(relations).some(function(rel) {
return relations[rel].type == "interpretation";
});
))
これにより、必要なネストされた値を含むオブジェクトがコレクションから返されますが、評価を行うには、コレクション内の各オブジェクトを検査する必要があります。このため、このような評価は、コレクション内のオブジェクトからのハード値としてではなく、インデックスを直接使用できるものと組み合わせた場合にのみ実際に使用する必要があります。
さらに良い解決策は、検索でインデックスを利用するためにデータを改造することを検討することです。 「評価」情報を更新する必要がある場合は、基本的に「フラット化」 代わりに、各「評価」要素を唯一の配列データと見なす構造:
{
"_id": "aeokejXMwGKvWzF5L",
"text": "test",
"relationsRatings": [
{
"relationId": "cF6iKAkDJg5eQGsgb",
"type": "interpretation",
"originId": "uFEjssN2RgcrgiTjh",
"ratingId": 1,
"ratingScore": 5
},
{
"relationId": "cF6iKAkDJg5eQGsgb",
"type": "interpretation",
"originId": "uFEjssN2RgcrgiTjh",
"ratingId": 2,
"ratingScore": 6
}
]
}
もちろん、検索は非常に簡単です。
db.theses.find({ "relationsRatings.type": "interpretation" })
そしてもちろん、位置$
演算子をよりフラットな構造で使用できるようになりました:
db.theses.update(
{ "relationsRatings.ratingId": 1 },
{ "$set": { "relationsRatings.$.ratingScore": 7 } }
)
もちろん、これは各「評価」値の「関連」データの複製を意味しますが、これは単一レベルの配列ネストでのみサポートされるため、通常、一致した位置で更新するためのコストです。
>したがって、ロジックを構造化した方法と一致させることができますが、そうすることはお勧めできません。パフォーマンスの問題が発生します。ただし、ここでの主なニーズが、単に内部リストに追加するのではなく、「評価」情報を更新することである場合は、よりフラットな構造の方が大きなメリットがあり、もちろん検索がはるかに高速になります。