我可以通过任何方式更改运行时mongo文档名称

时间:2019-03-22 08:17:41

标签: mongodb spring-boot spring-data-mongodb mongorepository

在项目中,我们需要每天根据日期更改集合名称后缀。

因此,某天的收藏被命名为:

samples_22032019

第二天是

samples_23032019

因此,每天我都需要更改后缀并重新编译spring-boot应用程序。有什么办法可以更改此设置,以便可以基于当前日期动态计算集合/表?对MongoRepository有什么建议吗?

2 个答案:

答案 0 :(得分:1)

考虑以下是您的bean。您可以将@Document批注与spring表达式语言一起使用,以在运行时解析后缀。像下面的显示一样,

@Document(collection = "samples_#{T(com.yourpackage.Utility).getDateSuffix()}")
public class Samples {
   private String id;
   private String name;
}

现在在Utility方法中具有日期更改功能,spring可以在运行时解析该日期更改功能。 SpEL在这种情况下很方便。

package com.yourpackage;

public class Utility {
  public static final String getDateSuffix() {
     //Add your real logic here, below is for representational purpose only.
     return DateTime.now().toDate().toString();;
  }
}

HTH!

答案 1 :(得分:0)

使cron作业每天运行,并为您的集合生成newName并执行以下代码。在这里,我使用MongoDatabse获取集合,而不是使用MongoNamespace来重命名集合。 要获取旧/新收藏名称,您可以编写一个单独的方法。

@Component
public class RenameCollectionTask {

  @Scheduled(cron = "${cron}")
  public void renameCollection() {

    // creating mongo client object
    final MongoClient client = new MongoClient(HOST_NAME, PORT);
    // selecting the mongo database
    final MongoDatabase database = client.getDatabase("databaseName");
    // selecting the mongo collection
    final MongoCollection<Document> collection = database.getCollection("oldCollectionName");
    // creating namespace
    final MongoNamespace newName = new MongoNamespace("databaseName", "newCollectionName");
    // renaming the collection
    collection.renameCollection(newName);
    System.out.println("Collection has been renamed");
    // closing the client
    client.close();
  }
}

要分配集合的名称,可以引用enter image description here,这样就不需要每次重新启动。

renameCollection()方法具有以下限制:
1)它不能在数据库之间移动集合。
2)sharded collections不支持它。
3)您不能重命名views
有关详细信息,请参见this