MongoDB: 稀疏值的唯一和稀疏复合索引

5

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

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分别建立索引。

1
对于唯一索引(复合或其他),您不能具有相同的键。您应该能够插入一个带有(主机名,null)的单个记录,但第二个具有相同主机名的记录将是重复的。 - Stennie
1个回答

5
请记住,MongoDB每次查询只能使用一个索引(它不会将索引连接起来以使查询两个具有单独索引的字段更快)。
话虽如此,如果您想尝试检查唯一性,可以在插入之前从应用程序进行查询(这只部分解决了问题,因为在查询和插入之间存在间隙)。
您可能希望对此JIRA问题进行投票以获取过滤索引,这可能有助于您的用例: https://jira.mongodb.org/browse/SERVER-785

哦,那它是如何决定要在哪个索引上工作的呢?我在插入之前已经检查了唯一性。 - Jonathan Ong
它根据集合和查询选择了几个不同的查询计划:http://www.mongodb.org/display/DOCS/Optimization - Randall Hunt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接