4

我需要一个解决方法,因为 MongoDB 不支持稀疏的唯一复合索引(null如果不存在,它会将值设置为,而当它是非复合索引时,它不会将字段添加到索引中)。见https://jira.mongodb.org/browse/SERVER-2193

在我的特殊情况下,我有events. 它们可以是一次性的,也可以是重复的。我有一个字段,该字段parent仅在事件是重复事件的实例时才存在(我定期创建父项的新副本以在系统中的下几周拥有重复事件)。

我想我只是添加这个索引,以防止 cronjob 运行两次时出现重复副本

events.ensureIndex({ dateFrom: 1, dateTo: 1, parent: 1 }) { sparse: true, unique: true } 

不幸的是,如上所述,MongoDB 不支持sparse复合索引。这意味着对于一次性事件,该parent字段不存在并且null由 MongoDB 设置。如果我现在同时有第二个一次性事件,它会导致重复键错误,我只在设置 parent 时才需要。

有任何想法吗?

编辑:我见过MongoDB: Unique and sparse complex index with sparse values,但是在应用程序级别检查唯一性是不行的。我的意思是这就是数据库的用途,以保证唯一性。

4

1 回答 1

1

您可以添加第四个字段,即 dateFrom+dateTo+parent(字符串连接)。当 parent 为 null 时,选择一个 uid,例如从 ObjectId 函数中,然后索引该字段(唯一)。

通过这种方式,您可以强制执行您想要的唯一性。但是,除了强制执行此约束之外,您几乎无法将其用于其他任何事情。(尽管诸如“获取字符串以 blah blah 开头的文档”之类的查询可能非常有效)

于 2013-09-23T16:03:32.257 回答