2012-09-12 18 views
5
TENANT 
    { "_ID" : 11, NAME : "ruben", OPERATION :[{OPERATION_ID: 100, NAME : "Check"}] } 

OPERATION_IDを設定する方法は重複する値を避け、プライマリキーのようなヌル値を避けるために一意ですか?Mongodb固有のフィールドを設定する

答えて

12

あなたはOPERATION_IDsは、すべてのテナントに対して一意になりたい場合は、あなたがそのようにそれを行うことができます。

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

次の2つのテナントが両方持つことができるようにOPERATION_IDsは、テナントごとに一意になりたいですoperation_ID:100だがテナントはoperation_id:100を2回持つことはできません。_idとoperation_idの任意の組み合わせが一意であるように、テナントの_idをインデックスに追加する必要があります。

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

OPERATION.OPERATION_IDにunique indexを追加すると、どの2つの別個の文書が同じoperation_idを用いて操作で要素を含まないであろうことを保証します。

同じOPERATION_IDを持つOPERATIONの2つの要素が1つの文書に含まれないようにするには、一意のインデックスを使用できません。 set update演算子($ setや$ addToSetなど)を使う必要があります。あなたはそうのように、operation_idををキーとサブドキュメントに操作を回すことができる:

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

は、その後、あなたが$に設定して更新を発行することによって一意性を強制することができます。例えば:

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

NULL値について:MongoDBは(それも一つのタイプを持つように指定されたフィールドを強制するものではありません)フィールド上の非NULL制約を備えていないので、あなたに確認する必要がありますnull値が挿入されないアプリケーション。

+0

こんにちは、値を挿入したいが、ログイン用のユーザー名のように一意の名前を持たせたいのですが、ログインコレクションに挿入する際にユーザー名を一意にする方法 –

関連する問題