【发布时间】:2012-09-05 21:11:50
【问题描述】:
TENANT
{ "_ID" : 11, NAME : "ruben", OPERATION :[{OPERATION_ID: 100, NAME : "Check"}] }
如何设置 OPERATION_ID 具有唯一性以避免重复值和避免主键等空值?
【问题讨论】:
标签: mongodb mongodb-query
TENANT
{ "_ID" : 11, NAME : "ruben", OPERATION :[{OPERATION_ID: 100, NAME : "Check"}] }
如何设置 OPERATION_ID 具有唯一性以避免重复值和避免主键等空值?
【问题讨论】:
标签: mongodb mongodb-query
在 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 对字段没有非空约束(它甚至不强制给定字段具有单一类型),因此您必须确保在您的应用程序中不存在空值插入。
【讨论】:
如果您希望所有租户的 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 } );
【讨论】: