如何在Mongo DB集合中的嵌入式数组上添加唯一索引

5

我试图在下面提到的Mongo集合中的scorecardList.filename字段上创建唯一索引。目的是我们不应该能够创建另一个具有相同文件名的scorecardList元素。

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 } 
        } 
    }
);

尽管索引已创建,我仍能使用现有文件名添加记分卡。
请帮忙。

您的示例文档中,scorecardList.fileName 中的 'N' 是大写的。而您的索引在 filename 上创建它,其中 'n' 是小写的。 - dyouberg
1个回答

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层面上是否有强制执行所需约束的方法,也许在插入或更新时可以在应用程序逻辑中进行检查?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接