Mongo部分过滤器是否可以在整个文档范围内工作,或者是否可以应用于每个单独的数组项目?

使用案例:

架构图

{ references: [
     {source: ObjectId("57dc688a1410a81ba0fcafcd"), sourceId: 1234},
     {source: ObjectId("57dc688a1410a81ba0fcafee"), sourceId: 5678},
]}


我有一个唯一索引,指出Source和SourceId应该是唯一的。这意味着任何两个文档和单个文档都不能具有相同的Source和SourceId。

我需要将其作为部分密钥,因为有时SourceId还不存在。所以我想添加过滤器:
{“ references.sourceId”:{“ $ exists”:true}}

但是一个文档可能在一个文档上有多个引用-一个带有sourceId,另一个没有sourceId。我希望带有sourceId的数组项被索引,而一个不被忽略。

正确的方法是什么?如果过滤器必须是文档范围的,如果任何引用缺少sourceId,是否有任何方法可以指定忽略文档?当前,mongo在部分索引过滤器的运算符中不接受逻辑取反。

最佳答案

Mongodb仅基于文档提供索引。如果文档具有一个数组,并且该数组具有多个字段,则对该字段的唯一性没有限制。即使您对具有部分表达式的字段应用唯一索引,数组中也可能具有相同的值

07-26 09:35