【问题标题】:MongoDB: Unique and sparse compound indexes with sparse valuesMongoDB:具有稀疏值的唯一和稀疏复合索引
【发布时间】:2012-07-09 05:21:15
【问题描述】:

我正在尝试存储以下链接:

URL = {
  hostname: 'i.imgur.com',
  webid: 'qkELz.jpg'
}

我想要这两个字段的唯一且稀疏的复合索引,因为:

  1. hostnamewebid 的组合应该是唯一的。
  2. webid 将始终使用 hostname 进行查询。
  3. webid 不必是全局唯一的。
  4. URL 不需要有 webid。

但是,当我这样做时,我收到以下错误:

MongoError: E11000 duplicate key error index: db.urls.$hostname_1_webid_1  dup key: { : "imgur.com", : null }

我猜在复合索引的情况下,空值被计算在内,而在常规索引中,它们不是。

有什么办法可以解决这个问题?现在我将分别索引hostnamewebid

【问题讨论】:

  • 对于unique indexes(复合或其他),您不能拥有相同的密钥。您应该能够插入带有 (hostname, null) 的单个记录,但具有相同主机名的第二个记录将是重复的。

标签: mongodb


【解决方案1】:

请记住,mongodb 每次查询只能使用一个索引(它不会将索引连接在一起以更快地对具有单独索引的两个字段进行查询)。

也就是说,如果您想尝试检查唯一性,可以在插入之前从应用程序中进行查询(这只能部分解决问题,因为查询和插入之间存在差距)。

您可能想为过滤索引的这个 JIRA 问题投票,这可能会对您的用例有所帮助: https://jira.mongodb.org/browse/SERVER-785

【讨论】:

  • 哦。那么它如何决定使用哪个索引呢?我在插入之前已经检查了唯一性。
  • 它有几个不同的查询计划,可以根据集合和查询从中选择:mongodb.org/display/DOCS/Optimization
猜你喜欢
  • 2013-06-12
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 2014-12-29
  • 2015-02-15
相关资源
最近更新 更多