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

时间:2016-06-26 10:08:01

标签: mongodb indexing

我们目前正在管理一组权限,作为集合上的地图。 每组权限都以用户的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?

1 个答案:

答案 0 :(得分: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"
        }