[英]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.