MongoDB解决方法不支持稀疏唯一复合索引

时间:2013-04-17 11:00:55

标签: mongodb

我需要一个解决方法,因为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字段不存在,并由MongoDB设置为null。如果我现在同时有第二次一次性事件,则会导致重复键错误,我只在设置父级时才需要这样做。

有什么想法吗?

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

1 个答案:

答案 0 :(得分:1)

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

通过这种方式,您可以强制执行所需的唯一性。但是,除了强制执行此约束之外,您几乎无法使用它。 (虽然像"查询字符串以blah blah&#34开头的文档可能非常有效)