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