【问题标题】:Update unique compound indexes on an existing data set更新现有数据集上的唯一复合索引
【发布时间】:2019-09-30 16:43:27
【问题描述】:

问题:

我正在尝试更新现有数据集上的唯一复合索引,而 Mongo 没有更新索引。

背景:

在我们的网络应用程序的数据库中,我们有一个使用用户的俱乐部 ID 和电子邮件的唯一复合索引。这意味着电子邮件对于用户的俱乐部 ID 而言必须是唯一的。

我正在更新此索引以允许用户共享电子邮件。我们在用户模型上添加了一个名为“primaryAccountHolder”的新属性。 我希望新的复合索引允许具有相同 clubID 的用户共享电子邮件,但同一俱乐部中只有一个用户可以将字段 primaryAccountHolder 设置为 true。我有这个索引在本地工作,但我们现有数据集的更新不成功。

我相信这是因为我们的数据库中存在不允许更新此索引的条目。所以我的问题是: 如何更新在现有数据集上保持唯一性的复合索引? 以下是我使用 Mongoose / Typescript 创建的索引。这些在本地工作,但不适用于我们现有的数据库。

旧索引:

UserSchema.index({ email: 1, clubID: 1 }, { unique: true })

// 不允许同一俱乐部的用户拥有相同的电子邮件。这是我们数据库中的索引。

新索引:

UserSchema.index({ email: 1, clubID: 1 }, { unique: true, partialFilterExpression: { email: { $exists: true }, primaryAccountHolder: { $eq: true } } })

// 将允许用户共享电子邮件,但只有其中一个可以将主要帐户持有人字段设置为 true。

新索引使用部分过滤器表达式。这是不是在现有数据集上创建的部分。

感谢您的帮助!

山姆·格鲁斯

【问题讨论】:

    标签: database mongodb mongoose mongoose-schema compound-index


    【解决方案1】:

    MongoDB 无法更新现有索引。您需要删除当前索引并创建新索引。

    来自https://docs.mongodb.com/manual/tutorial/manage-indexes/#modify-an-index

    要修改现有索引,您需要删除并重新创建索引。此规则的例外是 TTL 索引,可以通过 collMod 命令结合索引集合标志进行修改。

    【讨论】:

      【解决方案2】:

      您必须删除并重新创建索引:

      UserSchema.dropIndex({ email: 1, clubID: 1 })
      

      然后重新创建它:

      UserSchema.createIndex(
          { email: 1, clubID: 1 }, 
          { unique: true, 
              partialFilterExpression: 
              { email: { $exists: true },primaryAccountHolder: { $eq: true } }}
      )
      

      来自 MongoDB 文档: https://docs.mongodb.com/manual/tutorial/manage-indexes/#modify-an-index

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-15
        • 2017-02-19
        • 2016-05-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多