【问题标题】:How to add a unique index on an embedded array in Mongo DB collection如何在 Mongodb 集合中的嵌入式数组上添加唯一索引
【发布时间】:2017-04-16 06:11:09
【问题描述】:

我正在尝试在下面提到的 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”。并且您的索引正在使用小写“n”的文件名上创建它。

标签: mongodb unique-key embedded-documents


【解决方案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 函数 在添加之前会检查该值是否已经存在。

【讨论】:

    猜你喜欢
    • 2020-09-22
    • 2016-11-06
    • 2012-05-09
    • 1970-01-01
    • 2014-03-07
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多