【问题标题】:How to create a MongoDb index on key-name in Map[key, value]?如何在 Map[key, value] 中的键名上创建 MongoDb 索引?
【发布时间】:2016-06-26 10:08:00
【问题描述】:

我们目前正在将一组权限作为集合上的地图进行管理。 每组权限都以用户的 id 作为键来归档。由于某种原因,该密钥当前是 BSONObjectID 的字符串化版本。

我想在键上维护一个索引,这样我就可以只查找相关的权限集,还可以找到那些存在特定用户权限的文档。

编辑:添加示例:
示例:

{"_id" : {"$oid" : "xxxxxx"},  
"irrelevantData" : "Document1 data...",  
"permissions" : {  
    "key1" : {"perm1" : true, "perm2: false},  
    "key3" : {"perm1" : true, "perm2: false}  
}  
{"_id" : {"$oid" : "yyyyyy"},  
"irrelevantData" : "Document2 data...",  
"permissions" : {  
    "key1" : {"perm1" : false, "perm2: true},  
    "key2" : {"perm1" : true, "perm2: false}  
}

在上面的示例中,我希望我的索引能够仅选择权限中存在“key2”的文档。

模型是这样的:

case class relevantCollection(
  _id: BSONObjectID,
  irrelevantData: String,
  permissions: Option[Map[String, Map[String, Boolean]]]
)

如何在键而不是值上创建索引? 是否存在任何性能问题,关于此键是 String 还是 BSONObjectID?

【问题讨论】:

  • 在询问如何使用 ReactiveMongo 之前,我会检查 MongoDB index doc 并尝试使用 MongoShell。
  • @cchantep:我确实检查了MongoDB index doc,但没有找到任何关于如何索引键的信息。也许我读错了?如果我能按照你的建议为 MongoShell 找到一个可行的解决方案,我会很高兴:)
  • 因此,如果您在 MongoDB 文档中找不到方法,那么任何客户端库都无法做到。
  • @cchantep:我不知道我的理解是否正确,但我将您的第一条评论翻译为“尝试自己解决您的问题”,第二条评论为“如果可以的话”自己找不到答案,没有解决办法”?尽管您可能是对的,但我仍然希望有人能够反思我的问题的内容。

标签: mongodb indexing


【解决方案1】:

您可以使用 稀疏索引 来满足此要求。该索引将仅包含存在“permissions.key2”的文档。

db.permissions.createIndex({"permissions.key2" : 1}, {sparse: true })

以下查询可用于检查索引是否正在使用。

db.getCollection('permissions').find({"permissions.key2" : {
            "perm1" : true,
            "perm2" : false
        }}).explain();

在输出的JSON中,检查中奖计划是否有“IXSCAN”。

"winningPlan" : {
    "stage" : "FETCH",
    "inputStage" : {
        "stage" : "IXSCAN",
        "keyPattern" : {
            "permissions.key2" : 1
        },
        "indexName" : "permissions.key2_1",
        "isMultiKey" : false,
        "isUnique" : false,
        "isSparse" : true,
        "isPartial" : false,
        "indexVersion" : 1,
        "direction" : "forward",
        "indexBounds" : {
            "permissions.key2" : [ 
                "[{ perm1: true, perm2: false }, { perm1: true, perm2: false }]"
            ]
        }
    }
}

同样,如果您运行以下查询,获胜计划将显示“COLLSCAN”。

db.getCollection('permissions').find({"permissions.key1" : {
            "perm1" : false,
            "perm2" : true
        }}).explain()

"winningPlan" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "permissions.key1" : {
                    "$eq" : {
                        "perm1" : false,
                        "perm2" : true
                    }
                }
            },
            "direction" : "forward"
        }

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 2018-10-22
相关资源
最近更新 更多