TENANT
{ "_ID" : 11, NAME : "ruben", OPERATION :[{OPERATION_ID: 100, NAME : "Check"}] }
如何设置 OPERATION_ID 具有唯一性以避免重复值并避免像主键这样的空值?
TENANT
{ "_ID" : 11, NAME : "ruben", OPERATION :[{OPERATION_ID: 100, NAME : "Check"}] }
如何设置 OPERATION_ID 具有唯一性以避免重复值并避免像主键这样的空值?
When you want the OPERATION_IDs to be unique for all tenants, then you can do it like that:
db.tenants.ensureIndex( { operation.OPERATION_ID : 1 }, { unique:true, sparse:true } );
When you want the OPERATION_IDs to be unique per tenant, so that two tenants can both have the operation_ID:100 but no tenant can have operation_id:100 twice, you have to add the _id of the tenant to the index so that any given combination of _id and operation_id is unique.
db.tenants.ensureIndex( { _id: 1, operation.OPERATION_ID : 1 }, { unique:true, sparse:true } );
在 OPERATION.OPERATION_ID 上添加唯一索引将确保没有两个不同的文档将包含 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 对字段没有非空约束(它甚至不强制给定字段具有单一类型),因此您必须确保在您的应用程序中不插入空值。