Mongodb 如何在Mongo DB集合中的嵌入式阵列上添加唯一索引

Mongodb 如何在Mongo DB集合中的嵌入式阵列上添加唯一索引,mongodb,unique-key,embedded-documents,Mongodb,Unique Key,Embedded Documents,我正在尝试在下面提到的mongo集合中的scorecardList.filename字段上创建唯一索引。这样做的目的是我们不能在记分卡列表中创建具有相同文件名的另一个元素 Mongo模式: { "Name": "Ravikant Khond", "PIN" : "411057", "scorecardList": [ { "fileName" : "ScoreCard_April_2016.pdf", "ru

我正在尝试在下面提到的mongo集合中的scorecardList.filename字段上创建唯一索引。这样做的目的是我们不能在记分卡列表中创建具有相同文件名的另一个元素

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 } 
        } 
    }
);
即使已经创建了索引,我也可以使用现有文件名添加记分卡


请提供帮助。

对于数组,您无法强制执行完全唯一性

据我所知,唯一索引仅强制不同文档之间的唯一性,因此这会引发重复的键错误:

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级别强制执行您需要的约束,也许您可以在插入更新时检查应用程序逻辑

或者,使用$addToSet功能 将在添加该值之前检查该值是否已存在


示例文档显示的scorecardList.fileName带有大写字母“N”。您的索引是在文件名上用小写字母“n”创建的。