首页 > 解决方案 > Mongo 嵌套数组和(部分)唯一索引

问题描述

我正在使用 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)。

将其指定为数据库约束是否难以处理,是否必须将其作为应用程序级问题处理?或者有什么方法可以在不从根本上改变相关文档的结构的情况下,在数据库中获取我所说的内容?

标签: arraysmongodbunique-constraint

解决方案


推荐阅读