java - MongoDB : how to index the keys of a 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 文档,这些文档有一个 someProps,键为“4fda4993eb14ea4a4a149c04”,值为“Processed”

我在集合中存储了数百万个 MyDoc 文档,因此我需要对 someProps 嵌入对象的键进行有效索引。

事先不知道 map 的键(它们是动态生成的,它们不是一组固定的键),因此我无法为每个 someProps 键创建一个索引。 (至少我不认为如果我错了我可以纠正我)

我尝试直接在 someProps 上创建索引,但查询需要很长时间。

如何索引 someProps Map 键? 我需要不同的文档结构吗?

重要提示:

1 . someProps 中只能有一个元素具有相同的键。例如:

{
"_id" : ObjectId("4fb538eb5e9e7b17b211d5d3"),
    "someProps" : {
        "4fda4993eb14ea4a4a149c04" : "PROCESSED",
        "4f56a5c4b6f621f092b00525" : "PROCESSED",
        "4f56a5c4b6f621f092b00525" : "TODO"
    }
}

将无效,因为 4f56a5c4b6f621f092b00525 在 map 中找不到两次(因此首先使用 map )

2 。我还需要有效地更新 someProps,只更改值(例如:将“4fda4993eb14ea4a4a149c04”:“PROCESSED”更改为“4fda4993eb14ea4a4a149c04”:“CANCELLED”)

我有什么选择?

谢谢。

最佳答案

如果你想保持你的属性嵌入,你也可以使用 Kyle Banke 在“MongoDB in Action”中提出的动态属性模式。因此,您无需将 Prop 放入自己的集合中,而是将 mydocs 集合修改为如下所示:

{
  "_id" : ObjectId("4fb538eb5e9e7b17b211d5d3"),
  "someProps" : [
      { k: "4fda4993eb14ea4a4a149c04", v: "PROCESSED" },
      { k: "4f56a5c4b6f621f092b00525", v: "PROCESSED" },
      { k: "4fd95a2a0baaefd1837fe504", v : "TODO" }
  ]
}

然后对嵌入的文档键进行索引:

db.mydoc.ensureIndex({'someProps.k' :1}, {'someProps.v' :1})

这与 Sergio 的建议非常接近,但您的数据仍将是单个集合中的一个文档。

https://stackoverflow.com/questions/11074722/

相关文章:

node.js - 从 Mongoose 模型中找到的 native 驱动程序不返回光标

python - 具有以列表中指定的前缀开头的属性的对象的 MongoEngine 查询列表

ruby-on-rails - 获取字段最大值的对象[Mongoid]

mongodb - 设置 MongoDB 数据库配额 (SIZE)

mongodb - 处理 100+ 百万条记录的最佳 NoSQL 方法

mongodb - 我可以/应该在 Mongoose 中索引嵌入的文档吗?

php - MongoDB/Doctrine : can't nest $or in $and

mongodb - mongoose 更新 MongoDB 中的字段不起作用

node.js - 我应该将图像存储在 MongoDB 中还是本地文件系统中(通过 Node.js)

MongoDB - 从单个数组元素中取消设置属性