提案された構造の問題:
{
keyword" : "Just an example query",
"rankings" :
[{"rank" : 1, "domain" : "example1.com", "href" : "example1.com"},
...{ "rank" : 99, "domain" : "example99.com", "href" : "example99.com“}
]}
}
これでできますが
db.ranking.ensureIndex({"rankings.href":"text", "rankings.domain":"text"})
次に、次のようなクエリを実行します:
db.ranking.find({$text:{$search:"example1"}});
これで、配列要素が一致する配列ドキュメント全体が返されます。
多くの情報が繰り返されないように、各ランキング結果が個別のドキュメントになり、キーワードやその他のメタデータが参照されるように参照することを検討することをお勧めします。
したがって、次のようなキーワード/メタデータドキュメントがあります:
{_id:1, "keyword":"example query", "querydate": date, "other stuff":"other meta data"},
{_id:2, "keyword":"example query 2", "querydate": date, "other stuff":"other meta data 2"}
次に、次のような結果ドキュメント:
{keyword_id:1, {"rank" : 1, "domain" : "example1.com", "href" : "example1.com"},
... keyword_id:1, {"rank" : 99, "domain" : "example99.com", "href" : "example99.com"},
keyword_id:2, {"rank" : 1, "domain" : "example1.com", "href" : "example1.com"},
...keyword_id:2, {"rank" : 99, "domain" : "example99.com", "href" : "example99.com"}}
ここで、keyword_idはキーワード/メタデータテーブルにリンクします(参照します)。明らかに、実際には、_idsは "_id": "519817e508a16b447c00020e"のようになりますが、これは読みやすさのためだけです。クエリの種類に応じて、keyword_id、domain、hrefを一緒に、または個別にインデックスに登録できるようになりました。index key pattern too large error
は発生しません。 配列全体が返されるのではなく、一致するドキュメントが1つだけ取得されます。
ファジー/正規表現スタイルの検索が必要な場所と、メタデータを検索するのか、hrefとドメインだけを検索するのかについては完全にはわかりませんが、この構造は、インデックスを最大限に活用せずに、インデックス作成について考えるためのよりクリーンな方法になるはずです。従来通り。また、クエリパターンに応じて、通常のインデックスの検索結果とテキストインデックスを組み合わせることができます。
この答えは、 MongoDBの関係:埋め込みか参照か?> 構造を文書化することを検討するときに役立ちます。