Mongo嵌套数组和(部分)唯一索引

时间:2020-05-11 18:24:42

标签: arrays mongodb unique-constraint

我正在使用MongoDB v3.2。我的集合中的对象具有以下形式:

{
  ...
  root_array: [
    {
      ...
      child_array: [
         { 
           id: 'some-uuid'
         }
      ]
      ...
    },
    {
      ...
      child_array: [
         { 
           id: 'some-other-uuid'
         }
      ]
      ...
    }
    {
      ...
      child_array: [
        // possibly empty
      ]
      ...
    }
  ]
  ...
}

我想在此集合上具有一个唯一索引,以强制执行约束,即在整个集合中,没有child_array元素对象的id字段具有相同的值。我想要想要声明的方式仅仅是:

    collection.createIndex({ 
      'root_array.child_array.id': 1 
    }, {
      unique: true
    }); 

...实际上可以完成工作,除了并非所有child_arrays都是非空的事实。因此,两个退化对象(具有空的一个元素的root_arrays,包含一个零元素的child_array)会导致违反约束。这通常会导致我尝试指定partialFilterExpression来放松约束。但是,在这种情况下,我看不到一种方法。我想说的表达式看起来像这样:

    collection.createIndex({ 
      'root_array.child_array.id': 1 
    }, {
      unique: true,
      partialFilterExpression: {
        'root_array.child_array': {$gt: ''} 
      }
    }); 

...但是这似乎也是错误的,因为以下两个对象同样会导致约束冲突:

   { root_array: [ { child_array: [ { id: 1 } ] }, { child_array: [] } ] }
   { root_array: [ { child_array: [ { id: 2 } ] }, { child_array: [] } ] }

...,因为两个元素都满足partialFilterExpression,并且两个文档都具有一个不包含任何元素的child_array(因此,其子元素之一的ID不确定)。

将其指定为数据库约束是否棘手,并且必须将其作为应用程序级问题处理吗?还是有某种方法可以在不从根本上改变所讨论文档的结构的情况下理解数据库中我所说的话?

0 个答案:

没有答案