繁体   English   中英

如何在Map [key,value]中的键名上创建MongoDb索引?

[英]How to create a MongoDb index on key-name in Map[key, value]?

我们目前正在将一组权限作为集合上的地图进行管理。 每组权限都以用户的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,是否存在任何性能问题?

您可以为此要求使用稀疏索引 该索引仅包含“ 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"
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM