【问题标题】:CompoundIndex that allows different combinations允许不同组合的 CompoundIndex
【发布时间】:2021-04-05 21:33:14
【问题描述】:

我正在尝试在 mongodb 集合上实现唯一索引,其中列表中的子文档组合是唯一的。

允许: 允许以下权限,因为在另一个示例中还有 resourceID 不会损害唯一索引

{
    "permission_name": "read",
    "role_id": 1,
    "value": "ALLOW",
    "attributes": [{
        "key": "folderID",
        "value": "1"
    }],
}
{
    "permission_name": "read",
    "role_id": 1,
    "value": "ALLOW",
    "attributes": [{
        "key": "folderID",
        "value": "1"
    },
    {
        "key": "resourceID",
        "value": "1"  
    }]
}

不允许: 以下条目在数据库中是两次

{
    "permission_name": "read",
    "role_id": 1,
    "value": "ALLOW",
    "attributes": [{
        "key": "folderID",
        "value": "1"
    }],
}

但是当我使用以下方法创建索引时: db.permissions.createIndex({"permission_name", "role_id", "attributes.key", "attributes.value"}, {unique: true}),那么我“允许”中的示例由于重复键而无法实现。

【问题讨论】:

    标签: mongodb nosql key unique


    【解决方案1】:

    当 MongoDB 索引一个值数组时,它会在索引中为每个数组条目创建一个单独的键。

    对于示例中的第一个文档,键是(使用| 表示字段边界):

    "read"|1|"folderID"|"1"
    

    对于第二个文档,将有 2 个键添加到索引中:

    "read"|1|"folderID"|"1"
    "read"|1|"resourceID"|"1"
    

    在索引上设置unique:true 不允许索引中存在重复键。由于这 2 个文档都将创建密钥 "read"|1|"folderID"|1,因此不允许插入两者。

    如果您能够将数组作为单个实体进行索引,那么仍然会出现问题,因为数组和字段顺序都很重要,因此以下数组都将被视为不同:

    "attributes": [{"key": "folderID",
                    "value": "1"},
                   {"key": "resourceID",
                    "value": "1"  }]
    
    "attributes": [{"key": "resourceID",
                    "value": "1"  },
                   {"key": "folderID",
                    "value": "1"}]
    
    "attributes": [{"key": "folderID",
                    "value": "1"},
                   {"value": "1",
                    "key": "resourceID"}]
    

    为了确保数组元素组合的唯一性,您需要添加一个包含从元素派生的值的字段,并唯一标识一组特定的字段/值对。

    一种可能性是存储已排序字段/值列表的哈希,但这需要应用程序在每次数组更改时重新计算,并且任何更新都必须在提交新哈希的同时提交新数组才能生效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-12
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      相关资源
      最近更新 更多