问题:
我正在尝试在现有数据集上更新唯一的复合索引,而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。
新索引使用部分过滤器表达式。这是未在现有数据集上创建的部分。
感谢您的帮助!
山姆·克鲁斯
答案 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