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

Database 更新现有数据集上的唯一复合索引,database,mongodb,mongoose,mongoose-schema,compound-index,Database,Mongodb,Mongoose,Mongoose Schema,Compound Index,问题: 我正在尝试更新现有数据集上的唯一复合索引,而Mongo没有更新索引 背景: 在我们web应用程序的数据库中,我们使用用户的clubID和电子邮件创建了一个独特的复合索引。这意味着电子邮件对于用户的俱乐部出价必须是唯一的 我正在更新此索引,以允许用户共享电子邮件。我们在用户模型上添加了一个名为“primaryAccountHolder”的新属性。 我希望新的复合索引允许拥有相同俱乐部的用户共享电子邮件,但同一俱乐部中只有一个用户可以将primaryAccountHolder字段设置为tru

问题:

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

背景:

在我们web应用程序的数据库中,我们使用用户的clubID和电子邮件创建了一个独特的复合索引。这意味着电子邮件对于用户的俱乐部出价必须是唯一的

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

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

旧索引:

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

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

新索引:

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

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

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

谢谢你的帮助


Sam Gruse

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

发件人:

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


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

UserSchema.dropIndex({ email: 1, clubID: 1 })
然后重新创建它:

UserSchema.createIndex(
    { email: 1, clubID: 1 }, 
    { unique: true, 
        partialFilterExpression: 
        { email: { $exists: true },primaryAccountHolder: { $eq: true } }}
)
来自MongoDB文档: