TENANT
{ "_ID" : 11, NAME : "ruben", OPERATION :[{OPERATION_ID: 100, NAME : "Check"}] }
如何设置OPERATION_ID具有唯一性以避免重复值并避免像主键一样的空值?
答案 0 :(得分:12)
如果您希望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 } );
答案 1 :(得分:4)
在OPERATION.OPERATION_ID上添加unique index将确保没有两个不同的文档在OPERATION中包含具有相同OPERATION_ID的元素。
如果要防止单个文档在OPERATION中具有两个具有相同OPERATION_ID的元素,则不能使用唯一索引;您将不得不使用set update运算符(例如$ 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在字段上不具有非空约束(它甚至不强制给定字段具有单个类型),因此您必须在应用程序中确保空值不是插入