在项目中,我们需要每天根据日期更改集合名称后缀。
所以有一天收集的名字是:
samples_22032019
在第二天它是
samples_23032019
每天我都需要更改后缀并重新编译spring-boot应用程序。有什么方法可以改变这个,所以可以根据当前日期动态计算集合/表吗?对MongoRepository有什么建议吗?
考虑以下是你的豆。您可以使用带有Spring表达式语言的@Document注释来解析运行时的后缀。如下图所示,
@Document(collection = "samples_#{T(com.yourpackage.Utility).getDateSuffix()}")
public class Samples {
private String id;
private String name;
}
现在在Utility方法中有你的日期更改功能,弹簧可以在运行时解析。 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!
创建一个cron作业,每天运行并为您的集合生成newNewName,然后执行以下代码。在这里,我使用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();
}
}
要指定集合的名称,您可以引用this,以便每次都不需要重新启动。
renameCollection()
方法具有以下限制:
1)它不能在数据库之间移动集合。
2)sharded collections
不支持。
3)你不能重命名views
。
有关详细信息,请参阅this。