2016-12-01 62 views
0

我正試圖在下面提到的mongo集合中的scorecardList.filename字段上創建唯一索引。目的是我們不應該能夠在具有相同文件名的scorecardList中創建另一個元素。如何在MongoDB集合中的嵌入式數組中添加唯一索引

蒙戈架構:

{ 
    "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]

蒙戈命令我試圖如下使用在創建唯一索引是:

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

即使索引已創建我我能夠添加一個記分卡與現有的文件名。

請幫忙。

+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 } ] }) 

我不知道是否有任何方式強制執行,你需要在蒙戈水平的限制,也許它的東西,你可以檢查在應用程序邏輯中插入更新時?

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

相關問題