如果文档的多个待索引字段是数组,则无法创建复合多键索引。
然而,在一个在文档中的不同位置上,它说:
以下操作在stock.size和stock.quantity字段上创建多键索引: db.inventory.createIndex( { "stock.size":1,"stock.quantity":1}) 复合多键索引可以支持包含索引字段以及仅包含索引前缀的谓词的查询。
这两种说法不一致。
我遵循后一页的例子。以下是一个简化的版本:
db.inventory.drop({})
db.createCollection("inventory")
db.inventory.insert(
{
_id: 1,
item: "abc",
stock: [
{ size: "S", color: "red", quantity: 25 }
]
}
)
db.inventory.createIndex( { "stock.size": 1, "stock.quantity": 1 } )
db.inventory.find( { "stock.size": "M" } )
db.inventory.find( { "stock.size": "S", "stock.quantity": { $gt: 20 } } ).explain()重点是,我可以创建复合多索引。然而,查询计划显示它没有完全应用它:

它使用复合索引进行索引扫描。然而,在获取阶段,它仍然需要对字段进行筛选,这实际上是索引的第二部分。这意味着它实际上没有应用索引的第二部分。
这意味着,当有大量数据时,这样的查询就会本质上是缓慢的。
现在我的问题:
我的发现正确吗?是真正的第二个医生(这与第一个相矛盾)正确。还是我忽略了什么。因为..。当我说得对的时候,我们这里有个大问题:-o :-D
发布于 2020-06-11 02:08:09
没有矛盾。在示例中提供的文档只有一个数组。您所引用的页面有一个相关的引用:
您可以在{ "a.x":1,"a.z":1 }上创建复合索引。最多一个索引字段可以是数组的限制也适用。
在这种情况下,唯一的数组是a。
对于部分使用的索引,这似乎是正确的,但是您创建的索引可以用于在顶级文档中使用数组中的文档字段强制执行唯一性:
MongoDB Enterprise ruby-driver-rs:PRIMARY> db.inventory.createIndex( { "stock.size": 1, "stock.quantity": 1 } ,{unique:true})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"commitQuorum" : "votingMembers",
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1591841133, 7),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1591841133, 7)
}
MongoDB Enterprise ruby-driver-rs:PRIMARY> db.inventory.insert({stock:[{size:1,color:1}]})
WriteResult({ "nInserted" : 1 })
MongoDB Enterprise ruby-driver-rs:PRIMARY> db.inventory.insert({stock:[{size:1,color:1}]})
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: test.inventory index: stock.size_1_stock.quantity_1 dup key: { stock.size: 1.0, stock.quantity: null }"
}
})https://stackoverflow.com/questions/62315053
复制相似问题