51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

如何在使用Spring时更新MongoDb中的索引?

英文:

How to update index in MongoDb when using Spring?

问题 {#heading}

以下是翻译好的部分:

"我相信上面的代码意味着firstNamelastName的组合应该始终是唯一的。

现在,如果我想在这些约束中包括另一个列,比如我现在想要:

@Data
@CompoundIndex(
    name = "unique_name_with_age",
    def = "{ 'firstName':1 , 'lastName':1, 'ssn':1 }",
    unique = true)
@Document
public class Person {

我希望ssn字段也被考虑在唯一约束中。我的问题是,我该如何进行此更新?

在传统的关系型数据库中,比如PostgreSQL,我需要在数据库上运行一个命令来创建这个唯一约束,如果需要的话,运行迁移脚本来确保已存在的数据不违反这个新约束。

但是我不熟悉MongoDB,所以不确定在使用Spring Data MongoDB注解时如何进行这些更新。" 英文:

Let say I have class annotated with the following

@Data
@CompoundIndex(
    name = "unique_name_with_age",
    def = "{ 'firstName':1 , 'lastName':1 }",
    unique = true)
@Document
public class Person {

I believe the above means that the combination of firstName and lastName should always be unique.

Now what happens if I want to include another column in this constraints. Let say I now want

@Data
@CompoundIndex(
    name = "unique_name_with_age",
    def = "{ 'firstName':1 , 'lastName':1, 'ssn':1 }",
    unique = true)
@Document
public class Person {

so I want the ssn field to be considered in the unique constraints. My question is, how do I go about making this update?

In a typical RDBMS like postgres, I will need to run a command on the database that creates this unique constraints, and if need be, run a migration scripts to ensure already existing data does not violates this new constraints.

But I am not familair with MongoDB so not sure how to go about making these kinds of updates when using Spring data Mongodb annotations.

答案1 {#1}

得分: 1

Here are the translated code sections:

First Solution using Shell

# 删除名为 'unique_name_with_age' 的索引
db.person.dropIndex('unique_name_with_age')

# 创建新的索引
db.person.createIndex(
  {
      'firstName': 1, 'lastName': 1, 'ssn': 1
  },
  {
      "name": "unique_name_with_age",
      "unique": true
  }
)

Second Solution using Mongock

这个迁移解决方案使用了 Mongock。在您的情况下,索引具有相同的名称,这增加了复杂性。下面我解释了步骤,但为了更清晰,我还创建了这个 GitHub 仓库,您可以尝试使用它来查看 Mongock 的操作。迁移将需要两个步骤:

  1. 删除现有的索引

这可以通过将 Person 类上现有的 CompoundIndex 注释掉,并创建一个 Mongock 变更集以删除它来实现。

@ChangeUnit(id = "person-updater-changeset", order = "1")
public class PersonUpdaterChange {
...
    @Execution
    public void changeSet() {
        // 删除原始索引
        mongoTemplate.indexOps(Person.class).dropIndex("unique_name_with_age");
    }

    @RollbackExecution
    public void rollback() {
        // 在这里提供回滚操作
    }
}

然后运行应用程序。

  1. 更新 person 实体上的索引

    @CompoundIndex( name = "unique_name_with_age", def = "{ 'firstName': 1, 'lastName': 1, 'ssn': 1 }", unique = true)

然后运行应用程序。 英文:

First Solution using Shell

db.person.dropIndex('unique_name_with_age')

db.person.createIndex(
{
\'firstName\':1 , \'lastName\':1, \'ssn\':1
},
{
\"name\": \"unique_name_with_age\",
\"unique\": true
}
)

Second Solution using Mongock

This solution for migration uses Mongock. A complexity in your case is that the index has the same name. Below I have explained the steps, but for clarity I have also created this GitHub repository which you can try out to see how Mongock operates. The migration will require two steps:

  1. Drop the existing index

This can be achieved by commenting out the existing CompoundIndex on your Person class and by creating a Mongock changeset to drop it.

@ChangeUnit(id = "person-updater-changeset", order = "1")
public class PersonUpdaterChange {
...
    @Execution
    public void changeSet() {
        //Drop the original index
        mongoTemplate.indexOps(Person.class).dropIndex("unique_name_with_age");
    }

    @RollbackExecution
    public void rollback() {
        // Provide a rollback here
    }



`}
`

And run the application.

  1. Updating the index on the person Entity

    @CompoundIndex( name = "unique_name_with_age", def = "{ 'firstName':1 , 'lastName':1, 'ssn':1 }", unique = true)

And run the application.


赞(1)
未经允许不得转载:工具盒子 » 如何在使用Spring时更新MongoDb中的索引?