0

问题:

我正在尝试更新现有数据集上的唯一复合索引,而 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。

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

谢谢您的帮助!

山姆·格鲁斯

4

2 回答 2

1

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

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

于 2019-05-14T00:21:12.277 回答
0

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

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

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

于 2019-05-13T17:34:29.600 回答