MongoDB :如何索引Map的键
在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();
这应该读找到我的MyDoc文档,其中有一个带有密钥“4fda4993eb14ea4a4a4a149c04”和值“已处理”的props。
我在集合中存储了数百万个MyDoc文档,因此我需要对someProps嵌入对象的键进行有效的索引。
映射的键是事先不知道的(它们是动态生成的,它们不是一组固定的键),所以我不能为每个一些Props键创建一个索引。(至少我不认为如果我错了,我可以纠正我)
我试图直接在一些Props上创建索引,但查询花了很长时间。
如何在一些Props上索引映射键?我需要不同的文档结构吗?
重要提示:
1 .某些驱动程序只能有一个元素具有相同的键。例如:
{
"_id" : ObjectId("4fb538eb5e9e7b17b211d5d3"),
"someProps" : {
"4fda4993eb14ea4a4a149c04" : "PROCESSED",
"4f56a5c4b6f621f092b00525" : "PROCESSED",
"4f56a5c4b6f621f092b00525" : "TODO"
}
}
将无效,因为4f56a5c4b6f621f092b00525在Map中找不到两次(因此首先使用Map)
2 .我还需要有效地更新一些Props,只更改值(例如:将“4fda4993eb14ea4a4a4a149c04”:“已处理”更改为“4fda4993eb14ea4a4a149c04”:“已取消”)
我有哪些选择?
谢谢。