不支持稀疏唯一复合索引的MongoDB变通方法

不支持稀疏唯一复合索引的MongoDB变通方法,mongodb,Mongodb,我需要一种解决方法,因为MongoDB不支持稀疏唯一的复合索引(如果不存在,它将把值设置为null,而当它是非复合索引时,它不会将字段添加到索引中)。看 在我的特殊情况下,我有事件。它们可以是一次性的,也可以是周期性的。我有一个字段parent,只有当事件是周期性事件的实例时,该字段才会出现(我会定期创建父项的新副本,以便在接下来的几周内在系统中拥有周期性事件) 我想我应该添加这个索引,以便在cronjob运行两次时防止复制 events.ensureIndex({ dateFrom: 1, d

我需要一种解决方法,因为MongoDB不支持稀疏唯一的复合索引(如果不存在,它将把值设置为
null
,而当它是非复合索引时,它不会将字段添加到索引中)。看

在我的特殊情况下,我有
事件
。它们可以是一次性的,也可以是周期性的。我有一个字段
parent
,只有当事件是周期性事件的实例时,该字段才会出现(我会定期创建父项的新副本,以便在接下来的几周内在系统中拥有周期性事件)

我想我应该添加这个索引,以便在cronjob运行两次时防止复制

events.ensureIndex({ dateFrom: 1, dateTo: 1, parent: 1 }) { sparse: true, unique: true } 
不幸的是,如上所述,MongoDB在复合索引上不支持
sparse
。这意味着对于一次性事件,
parent
字段不存在,并且由MongoDB设置为
null
。如果我现在同时有第二个一次性事件,它会导致重复的键错误,我只希望在设置父项时发生此错误

有什么想法吗


编辑:我看到了,但在应用程序级别检查唯一性是不可能的。我的意思是,这就是数据库的作用,以保证唯一性。

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


通过这种方式,您可以强制实现所需的唯一性。但是,除了强制执行此约束之外,您几乎不能将其用于任何其他用途。(虽然像“GetDocs where the string where start with blah blah”这样的查询可能非常有效)

这并不漂亮,但可能会起作用。不过,我确实设法使用了另一种解决方法,在索引中添加了更多特定于域的字段,这在我的案例中是有意义的。我还添加了事件的
标题
,这样我就不会对同时发生的两个事件有任何问题(我还添加了创建者/用户)