在Java中我有一个对象,看起来像这样一个Map的键:的MongoDB:如何索引
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”一someProps的MyDoc文件和值“加工”
我有几百万存储在集合中MyDoc文件,所以我需要在高效的索引someProps嵌入式对象的键。
地图的键是事先不知道的(它们是动态生成的,它们不是一组固定的键),所以我不能为每个Props键创建一个索引。 (至少我不认为我可以纠正我,如果我错了)
我试图直接在someProps上创建索引,但查询花了很长时间。
如何索引someProps Map键? 我需要不同的文档结构吗?
重要说明:
1。只有一些具有相同关键点的元素中有一个元素。例如:
{
"_id" : ObjectId("4fb538eb5e9e7b17b211d5d3"),
"someProps" : {
"4fda4993eb14ea4a4a149c04" : "PROCESSED",
"4f56a5c4b6f621f092b00525" : "PROCESSED",
"4f56a5c4b6f621f092b00525" : "TODO"
}
}
将是无效的,因为4f56a5c4b6f621f092b00525不能在地图(因此在第一位置使用地图)中找到两次
2。我还需要有效地更新someProps,只是改变了值(例如:改变“4fda4993eb14ea4a4a149c04”:“加工”,以“4fda4993eb14ea4a4a149c04”:“取消”)
我有哪些选择?
谢谢。
看起来最好将这些设置移动到单独的文档中。 –
@Sergio:你的意思是把文件somProps放在一个单独的集合中? – azpublic
是的,我会从'someProps'的每个条目中创建一个单独的文档。 –