【问题标题】:Mongodb setting unique fieldMongodb设置唯一字段
【发布时间】:2012-09-05 21:11:50
【问题描述】:
 TENANT
  { "_ID" : 11, NAME : "ruben", OPERATION :[{OPERATION_ID: 100, NAME : "Check"}] }

如何设置 OPERATION_ID 具有唯一性以避免重复值和避免主键等空值?

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    在 OPERATION.OPERATION_ID 上添加 unique index 将确保没有两个不同的文档包含 OPERATION 中具有相同 OPERATION_ID 的元素。

    如果要防止单个文档在 OPERATION 中有两个具有相同 OPERATION_ID 的元素,则不能使用唯一索引;您将不得不使用集合更新运算符(例如 $set 和 $addToSet)。您可以将 OPERATION 转换为由 OPERATION_ID 键入的子文档,如下所示:

    { "_ID" : 11, NAME : "ruben", OPERATION : {"100" : {NAME : "Check"} }}
    

    然后您可以通过使用 $set 发布更新来强制唯一性;例如:

    db.<collection>.update({NAME: "ruben"}, {$set: {"OPERATION.100.NAME": "Uncheck"}})
    

    关于空值:MongoDB 对字段没有非空约束(它甚至不强制给定字段具有单一类型),因此您必须确保在您的应用程序中不存在空值插入。

    【讨论】:

    • 您想插入值但具有唯一名称,例如用于登录的用户名,如何在插入登录集合时使用户名唯一
    【解决方案2】:

    如果您希望所有租户的 OPERATION_ID 都是唯一的,那么您可以这样做:

    db.tenants.ensureIndex( { operation.OPERATION_ID : 1 }, { unique:true, sparse:true } );
    

    如果您希望每个租户的 OPERATION_ID 是唯一的,以便两个租户都可以拥有 operation_ID:100 但没有租户可以拥有 operation_id:100 两次,则必须将租户的 _id 添加到索引中,以便任何_id 和 operation_id 的给定组合是唯一的。

    db.tenants.ensureIndex( { _id: 1, operation.OPERATION_ID : 1 }, { unique:true, sparse:true } );
    

    【讨论】:

      猜你喜欢
      • 2020-09-25
      • 2018-02-07
      • 2011-05-16
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 2019-01-31
      • 2021-04-13
      相关资源
      最近更新 更多