如何定义复合和哈希 mongodb 索引?

Posted

技术标签:

【中文标题】如何定义复合和哈希 mongodb 索引?【英文标题】:how to define a compound and hashed mongodb index? 【发布时间】:2014-02-25 10:55:09 【问题描述】:

我知道复合索引是这样定义的:

db.products.ensureIndex(  "item": 1, "stock": 1  )

和一个像这样的简单索引:

db.active.ensureIndex(  item: "hashed"  )

问题是如何实现两者?

【问题讨论】:

显然,7 年后,您现在可以do this with compatibility version 4.4。 【参考方案1】:

根据hashed index documentaion你不能!

MongoDB 支持任何单个字段的哈希索引。散列 函数折叠子文档并计算整个散列 值,但不支持多键(即数组)索引。

您可能创建具有散列索引字段的复合索引

PS:以上对2.4和2.6版本有效(目前是最新版本)

PS2:根据@naman 的answer,现在可以在 4.4 版中使用

【讨论】:

多键索引与复合索引不同。在示例中,item 和 stock 不是数组。 我知道,我没有说相反的。最后它说您不能创建具有散列索引字段的复合索引,并且您只能创建单个字段的复合索引,这回答了您的要求。如果您绝对需要这两个字段的哈希索引,请将它们作为子文档作为单个字段,根据文档,它可以工作。 好吧,我的意图是按照你最后说的,组合两个字段然后计算哈希,而不是对单个字段进行哈希然后组合它(因为显然不允许文件说)。我只是想有一种方法可以散列自动组合的字段。但正如你所说,我需要创建一个新字段并对其进行哈希处理。 您可以在jira.mongodb.org/browse/SERVER-10220 上为将来版本中包含的此功能投票 显然,7 年后,您现在可以do this with compatibility version 4.4。【参考方案2】:

MongoDB 4.4 支持单哈希的复合索引,可以像这样创建

db.collection.createIndex( "colA" : 1, "fieldB" : "hashed" )

注意:确保 featureCompatibilityVersion 设置为 4.4,以便您可以创建复合哈希索引。

db.adminCommand( setFeatureCompatibilityVersion: "4.4" )

【讨论】:

感谢您的贡献,这里的赏金是draw attention to this answer,您所做的答案最终会成为重复的。因此,建议关闭它以支持其他答案。【参考方案3】:

如果要实现复合哈希索引,4.4及以上版本是可行的。从documentation,您现在可以将其创建为:

db.adminCommand(  setFeatureCompatibilityVersion: "4.4"  )
db.collection.createIndex(  "fieldA" : 1, "fieldB" : "hashed", "fieldC" : -1  )

对于有问题的特定示例

db.products.ensureIndex(  "item": "hashed", "stock": 1  )

【讨论】:

以上是关于如何定义复合和哈希 mongodb 索引?的主要内容,如果未能解决你的问题,请参考以下文章

复合索引如何在 mongodb 中工作?

我应该如何构建我的 MongoDB 复合索引?

MongoDB ODM 索引:如何在本身具有 EmbeddedDocument 的文档上索引多个复合索引?

MongoDB索引,是不是可以同时创建普通和复合?

MongoDB - 唯一索引与复合索引

MongoDB通过许多参数过滤(复合索引与否)