在现有数据集上更新唯一的复合索引

时间:2019-05-13 17:23:40

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

问题:

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

背景:

在我们的网络应用程序数据库中,我们使用用户的clubID和电子邮件提供了唯一的复合索引。这意味着电子邮件在用户俱乐部ID方面必须唯一。

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

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

旧索引:

UserSchema.index({电子邮件:1,clubID:1},{unique:true})

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

新索引:

UserSchema.index({电子邮件:1,clubID:1},{唯一:true,partialFilterExpression:{电子邮件:{$ exists:true},primaryAccountHolder:{$ eq:true}}})

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

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

感谢您的帮助!

山姆·克鲁斯

2 个答案:

答案 0 :(得分:0)

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

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

  

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

答案 1 :(得分:0)

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

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