5
 TENANT
  { "_ID" : 11, NAME : "ruben", OPERATION :[{OPERATION_ID: 100, NAME : "Check"}] }

OPERATION_ID を一意に設定して、値の重複を回避し、主キーのような null 値を回避する方法は?

4

2 に答える 2

12

OPERATION_ID をすべてのテナントで一意にする場合は、次のようにします。

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

OPERATION_ID をテナントごとに一意にして、2 つのテナントが両方とも operation_ID:100 を持つことができるが、どのテナントも operation_id:100 を 2 回持つことができないようにする場合は、テナントの _id をインデックスに追加する必要があります。 _id と operation_id は一意です。

db.tenants.ensureIndex( { _id: 1, operation.OPERATION_ID : 1 }, { unique:true, sparse:true } );
于 2012-09-12T20:30:45.717 に答える
4

OPERATION.OPERATION_ID に一意のインデックスを追加すると、OPERATION 内に同じ OPERATION_ID を持つ要素が 2 つの異なるドキュメントに含まれないようになります。

1 つのドキュメントの OPERATION に同じ OPERATION_ID を持つ 2 つの要素が含まれないようにする場合は、一意のインデックスを使用できません。セット更新演算子 ($set や $addToSet など) を使用する必要があります。次のように、OPERATION を OPERATION_ID をキーとするサブドキュメントに変換できます。

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

次に、$set; を使用して更新を発行することにより、一意性を強制できます。例えば:

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

null 値について: MongoDB はフィールドに対する非 null 制約を備えていないため (特定のフィールドに単一の型を強制することさえありません)、アプリケーションで null 値が挿入されないようにする必要があります。

于 2012-09-12T21:07:01.393 に答える