MongoDB非支持性稀疏唯一复合索引的解决方法

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”字段不存在,并且由MongoDB设置为“null”。如果我现在在同一时间有第二个一次性事件,则会导致重复键错误,而我只希望在设置了父级时才出现此错误。
有什么想法吗?
编辑:我已经看到了MongoDB:具有稀疏值的唯一和稀疏复合索引,但在应用程序级别检查唯一性是不可行的。我的意思是,数据库就是为了保证唯一性而存在的。

可能是 https://stackoverflow.com/questions/45675385/mongodb-compound-sparse-indexes 的重复问题。 - JohnnyHK
1个回答

1
你可以添加第四个字段,它将是dateFrom+dateTo+parent(字符串连接)。当父级为null时,选择一个uid,例如来自ObjectId函数,然后索引该字段(唯一)。这样,您就可以强制执行所需的唯一性。但是,您几乎无法将其用于除了强制执行此约束之外的任何其他内容。(尽管查询“获取以blah blah开头的文档”可能非常有效)

虽然不太美观,但可能会起作用。不过我设法通过向索引添加更多领域特定字段来使用另一种解决方法,这在我的情况下是有意义的。我也添加了事件的“标题”,这样我就不会遇到同时发生两个事件的问题了(我还添加了创建者/用户)。 - Prinzhorn

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