2013-04-17 129 views
4

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

在我的特殊情况下,我有events。他们可以是一次性的或经常性的。我有一个字段parent,该字段仅在事件是重复事件的实例(我定期创建父系的新副本以在系统的未来几周内发生重复事件)时才存在。

我以为当的cronjob上面说的MongoDB作为复合索引不支持sparse不幸的是运行两次

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

我只是为了避免重复副本添加此指数。这意味着对于一次性事件,parent字段不存在,并且由MongoDB设置为null。如果我现在同时有第二个一次性事件,它会导致一个重复的键错误,我只在设置父项时需要这个错误。

任何想法?

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

+0

可能的重复https://stackoverflow.com/questions/45675385/mongodb-compound-sparse-indexes – JohnnyHK

回答

0

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

这样你就可以执行你想要的唯一性。但是,除了强制执行此约束之外,您几乎不能使用它。 (虽然像“获取文档的字符串以blah等待开始”这样的查询可能非常高效)

+0

这不是很漂亮,但可能会奏效。然而,我确实通过向索引添加了更多特定于域的字段来使用另一种解决方法,这对我而言是有意义的。我还添加了事件的标题,这样我就不会同时遇到两个事件(我也添加了创建者/用户)。 – Prinzhorn