当前位置: 首页 > 知识库问答 >
问题:

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

巫马泓
2023-03-14

我正在尝试创建唯一的索引在scorecardlist.filename字段在下面提到的mongo集合。目的是我们不能在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 } 
        } 
    }
);

共有1个答案

裴泰平
2023-03-14

对于数组,不能强制执行完全唯一性

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

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函数可以在添加值之前检查值是否已经存在。

 类似资料:
  • 本文向大家介绍如何在MongoDB聚合中将数组元素的子集相加?,包括了如何在MongoDB聚合中将数组元素的子集相加?的使用技巧和注意事项,需要的朋友参考一下 要将数组元素的子集加在一起,请使用$first和$sum。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 这是将MongoDB聚合中数组元素的子集加在一起的查询- 这将产生以下输出-

  • 在上面的屏幕截图中,您可以看到我从mongo数据库中的测试集合中打开了一个名为(1)ObjectId(572b…ec7a)的文档。(测试集合中充满了这样的文档)在屏幕截图底部附近,您可以看到一个名为Name的字段,该字段的类型为string,值为EditMessagesSettings。我想查询tests集合并返回任何包含特定名称的文档(如本例中的EditMessagesSettings)。我该怎

  • 我有一张桌子,不知怎的,同一个人进了我的桌子两次。现在,主键只是一个自动编号,但还有两个字段存在,我想强制它们是唯一的。 例如,这些字段是: 我只想要一张带有唯一PersonNumber和Active=1的唱片 (因此这两个字段的组合必须是唯一的) SQL server中现有表的最佳方式是什么?我可以这样做,如果其他任何人使用与现有值相同的值进行插入,则插入失败,因此我不必在应用程序代码中担心这一

  • 我有一个数据结构,其中一个主题有许多问题(一对多),一个问题有许多答案(一对多)。 我已经在主题表单中设置了问题作为嵌入式集合,由于有了烹饪书条目,我可以百分之百地解决所有问题。 当我试图开发它以在问题表单中嵌入一组答案表单时,我遇到了一个问题。 包含顶层原型表单的数据原型属性具有表单的全部深度,因此包括问题和答案的原型。但它对每个级别使用相同的占位符。 你可以在底部看到一条很长的线,我想这就是原

  • 我们试图使用以下源代码在组合框中显示树状结构https://fiddle.sencha.com/#fiddle/g50 我们可以在组合框中查看树结构,但是当我们选择任何节点时,它不会显示在组合框中。

  • 问题内容: 假设mongodb文档(表)“用户”为 我想找到获得“国家奖章”的人,必须在1975年获得该奖。可能会有其他人在不同的年份获得此奖。 如何使用奖励类型和年份查找此人。这样我就可以找到确切的人。 问题答案: 正确的方法是: 允许您在同一数组元素中匹配多个组件。 没有mongo的用户会在1975年代和某些奖项中寻找获得National Medal的用户,但不会寻找1975年获得Nation