Javaには、次のようなオブジェクトがあります。
class MyDoc {
ObjectId docId;
Map<String, String> someProps = new HashMap<String,String>();
}
これをMongoDBに永続化すると、次のドキュメントが生成されます。
{
"_id" : ObjectId("4fb538eb5e9e7b17b211d5d3"),
"someProps" : {
"4fda4993eb14ea4a4a149c04" : "PROCESSED",
"4f56a5c4b6f621f092b00525" : "PROCESSED",
"4fd95a2a0baaefd1837fe504" : "TODO"
}
}
次のようにクエリする必要があります。
DBObject queryObj =
new BasicDBObject("someProps.4fda4993eb14ea4a4a149c04","PROCESSED");
DBObject explain =
getCollection().find(queryObj).hint("props_indx").explain();
キーが「4fda4993eb14ea4a4a149c04」で値が「Processed」のsomePropsを持つMyDocドキュメントを見つけてください。
コレクションには何百万ものMyDocドキュメントが保存されているため、someProps埋め込みオブジェクトのキーに効率的なインデックスを付ける必要があります。
マップのキーは事前にわからないため(動的に生成され、固定されたキーのセットではありません)、somePropsキーごとに1つのインデックスを作成できません。(少なくとも、私が間違っていれば私を訂正できるとは思いません)
somePropsで直接インデックスを作成しようとしましたが、クエリに時間がかかりました。
somePropsマップキーのインデックスを作成するにはどうすればよいですか?別のドキュメント構造が必要ですか?
インプロタントノート:
1。同じキーを持つsomePropsの要素は1つだけです。例えば :
{
"_id" : ObjectId("4fb538eb5e9e7b17b211d5d3"),
"someProps" : {
"4fda4993eb14ea4a4a149c04" : "PROCESSED",
"4f56a5c4b6f621f092b00525" : "PROCESSED",
"4f56a5c4b6f621f092b00525" : "TODO"
}
}
4f56a5c4b6f621f092b00525がマップ内で2回見つからないため、無効になります(したがって、最初にマップを使用します)
2。また、値を変更するだけで、somePropsを効率的に更新する必要があります(例:「4fda4993eb14ea4a4a149c04」:「PROCESSED」を「4fda4993eb14ea4a4a149c04」:「CANCELLED」に変更)
私のオプションは何ですか?
ありがとう。