java 在Sping Boot 时指定MongoDb集合名称

fkaflof6  于 2022-12-10  发布在  Java
关注(0)|答案(3)|浏览(456)

我尝试在两个不同的微服务中重用现有的EmployeeRepository代码(见下文),以便将数据存储在两个不同的集合中(在同一个数据库中)。

@Document(collection = "employee")
public interface EmployeeRepository extends MongoRepository<Employee, String>

是否可以修改@Document(collection = "employee")以接受运行时参数?例如@Document(collection = ${COLLECTION_NAME})
您会推荐这种方法吗?还是我应该创建一个新的存储库?

zfycwa2u

zfycwa2u1#

这是一个非常古老的线索,但我会在这里添加一些更好的信息,以防其他人发现这个讨论,因为事情比公认的答案所声称的要灵活一些。
您可以对集合名称使用运算式,因为spel是解析集合名称的可接受方式。例如,如果您在www.example.com档案中有如下的属性application.properties:

mongo.collection.name = my_docs

如果在配置类中为该属性创建一个Spring Bean,如下所示:

@Bean("myDocumentCollection")
public String mongoCollectionName(@Value("${mongo.collection.name}") final String collectionName) {
    return collectionName
}

然后,您可以使用该名称作为持久性文档模型的集合名称,如下所示:

@Document(collection = "#{@myDocumentCollection}")
public class SomeModel {
    @Id
    private String id;
    // other members and accessors/mutators
    // omitted for brevity
}
jobtbby3

jobtbby32#

这应该是不可能的,文档中规定集合字段应该是集合名称,因此不是表达式:http://docs.spring.io/spring-data/data-mongodb/docs/current/api/org/springframework/data/mongodb/core/mapping/Document.html
至于你的另一个问题--即使可以传递表达式,我还是建议创建一个新的仓库类--代码重复并不是坏事,而且你的微服务可能需要执行不同的查询,而单个仓库类的方法会迫使你在同一个接口中保留所有微服务的查询方法,这不是很干净。
看看这段视频,他们列出了一些非常有趣的方法:http://www.infoq.com/presentations/Micro-Services

jgwigjjp

jgwigjjp3#

我用@environment.getProperty()从我的application.yml中读取。如下所示:

  • 应用程序.yml:*
mongodb:
  collections:
    dwr-suffix: dwr

产品型号:

@Document("Log-#{@environment.getProperty('mongodb.collections.dwr-suffix')}")
public class Log  {
    @Id
    String logId;
    ...

相关问题