2016-12-01 9 views
0

下記のmongoコレクションのscorecardList.filenameフィールドにユニークなインデックスを作成しようとしています。目的は同じファイル名でscorecardListに別の要素を作成できないはずです。Mongo DBコレクションの埋め込み配列にユニークなインデックスを追加する方法

Mongoのスキーマ:

{ 
    "Name": "Ravikant Khond", 
    "PIN" : "411057", 
    "scorecardList": [ 
     { 
      "fileName" : "ScoreCard_April_2016.pdf", 
      "runDate" : ISODate("2016-05-01T00:00:00.000Z"), 
      "month" : "April", 
      "year" : "2016" 
     }, 
     { 
      "fileName" : "ScoreCard_May_2016.pdf", 
      "runDate" : ISODate("2016-06-01T00:00:00.000Z"), 
      "month" : "May", 
      "year" : "2016" 
     } 
    ] 
} 

次のように[1]一意インデックスの作成中に、私が使用しよう

Mongoのコマンドである:

db.testing.createIndex(
    { "scorecardList.filename": 1 }, 
    { 
     unique: true, 
     partialFilterExpression: { 
      "scorecardList.filename": { $exists: true } 
     } 
    } 
); 

インデックスが作成されているにもかかわらずIスコアカードに既存のファイル名を追加することができます。

助けてください。

+0

サンプルドキュメントでは、scorecardList.fileNameに大文字の「N」が表示されます。そして、あなたのインデックスは、ファイル名に小文字の「n」を付けてインデックスを作成しています。 – dyouberg

答えて

-1

あなたはそれが私の知る限りでは

をアレイに来るとき、ユニークなインデックスが異なるだけで、文書全体で一意性を強制するので、これは重複キーエラーをスローします、完全な一意性を強制することはできません。

db.food.insert({ id: 123, name:bread, ingredients: [ { id: 456 } ] }) 
db.food.insert({ id: 123, name:bread, ingredients: [ { id: 456 } ] }) 

をしかし、これは許可されています

db.food.insert({ id: 123, name:bread, ingredients: [ { id: 456 }, { id: 456 } ] }) 

私はどのような方法があります場合は、Mongoのレベルで必要な制約を強制し、多分それはあなたがチェックできる何かよく分かりませんあなたは更新を挿入するときにアプリケーションのロジックで?

alternatively, using the $addToSet function would check if the value already exists before adding it.

関連する問題