mongodb:为嵌套文档创建顶级索引,而不必索引每个单独的子级别?

Car*_*rst 3 mongodb

这个问题是关于我如何使用 MongoDB 中的索引在嵌套文档中查找内容,而不必索引每个单独的子级别。我在 MongoDB 中有一个集合“测试”,它基本上是这样的:

{
"_id" : ObjectId("50fdd7d71d41c82875a5b6c1"),
"othercol" : "bladiebla",
"scenario" : {
        "1" : { [1,2,3] },
        "2" : { [4,5,6] }
}}
Run Code Online (Sandbox Code Playgroud)

场景有多个键,每个文档可以有场景的任何子集(即从无到子集到全部)。另外:场景不能是数组,因为我需要它作为 Python 中的字典。我在“场景”字段上创建了一个索引。
我的问题是我想在集合上进行选择,过滤具有特定值的文档。所以这在功能上运行良好:

db.test.find({"scenario.1": {$exists: true}})
Run Code Online (Sandbox Code Playgroud)

但是,它不会使用我在场景中放置的任何索引。仅当我将索引放在“scenario.1”上时,才会使用索引。但是我可以有数千个(或更多)场景(并且集合本身有 100.000 条记录),所以我宁愿不要!
所以我尝试了替代方案:

db.test.find({"scenario": "1"}) 
Run Code Online (Sandbox Code Playgroud)

这将在场景中使用索引,但不会返回结果。使场景成为数组仍然会产生相同的索引问题。

我的问题清楚吗?谁能指出我如何在这里实现最佳性能?

Ps 我见过这个:如何在 MongoDB 中创建嵌套索引?但在我的情况下,该解决方案是不可能的(由于场景的数量)

Joh*_*yHK 5

把一个的子对象的索引scenario在这种情况下没用,因为当你在过滤完成它只会被用来scenario对象,而不是单个字段(认为它是一个二进制的blob比较)。

您要么需要在每个可能的字段("scenario.1""sceanario.2"等)上添加索引,要么通过执行以下操作来重新设计架构以摆脱动态键:

{
"_id" : ObjectId("50fdd7d71d41c82875a5b6c1"),
"othercol" : "bladiebla",
"scenario" : [
    { id: "1", value: [1,2,3] },
    { id: "2", value: [4,5,6] }
}}
Run Code Online (Sandbox Code Playgroud)

然后您可以添加单个索引scenario.id来支持您需要执行的查询。

我知道你说你需要scenario是一个 dict 而不是一个数组,但我不知道你有多少选择。