在容器上运行的 mongoDB 中创建集合和检索数据的方法

Posted

技术标签:

【中文标题】在容器上运行的 mongoDB 中创建集合和检索数据的方法【英文标题】:Way to create Collections and retrieve data in a mongoDB running on Container 【发布时间】:2021-09-01 08:29:46 【问题描述】:

我在我的应用程序的容器上运行了一个 MongoDB 映像。 我想在这个数据库上创建集合和文档,然后突然检索数据以测试执行 CRUD 操作的自定义存储库。 我是 JUnit 测试和容器的新手,所以我真的不知道该怎么做。 我在网上看到有人使用 docker-compose 文件,但我直接使用 Java 类创建了 MongoDBContainer,如下例所示:

public class MongoDbContainer extends GenericContainer<MongoDbContainer> 

    
    public static final int MONGODB_PORT = 27018;
    public static final String DEFAULT_IMAGE_AND_TAG = "mongo:4.2";

    /**
     * Creates a new @link MongoDbContainer with the @value DEFAULT_IMAGE_AND_TAG image.
     * @deprecated use @link MongoDbContainer(DockerImageName) instead
     */
    @Deprecated
    public MongoDbContainer() 
        this(DEFAULT_IMAGE_AND_TAG);
    

    /**
     * Creates a new @link MongoDbContainer with the given @code 'image'.
     *
     * @param image the image (e.g. @value DEFAULT_IMAGE_AND_TAG) to use
     * @deprecated use @link MongoDbContainer(DockerImageName) instead
     */
    public MongoDbContainer( String image) 
        this(DockerImageName.parse(image));
    

    /**
     * Creates a new @link MongoDbContainer with the specified image.
     */
    public MongoDbContainer(final DockerImageName dockerImageName) 
        super(dockerImageName);
        addExposedPort(MONGODB_PORT);
    

    /**
     * Returns the actual public port of the internal MongoDB port (@value MONGODB_PORT).
     *
     * @return the public port of this container
     * @see #getMappedPort(int)
     */
    public Integer getPort() 
        return getMappedPort(MONGODB_PORT);
    

 

然后我使用这个类在测试类中创建一个新对象,如下所示:

    @Testcontainers
    @SpringBootTest
    public class MongoDbContainerTest  
    
        @Container
        static MongoDbContainer container = new MongoDbContainer(DockerImageName.parse("mongo:4.2"));

        @Test
        public void Container_Should_Be_Up() 
           assertNotNull(container);
           assertNotNull(container.getExposedPorts());      
        

我不知道这是否是在测试中运行 docker 容器的正确方法,但我想知道如何使用 Java 代码连接到该数据库。

感谢任何回答的人。

【问题讨论】:

【参考方案1】:

这是一种可能(也是推荐的)使用 Testconainers 创建 MongoDB 数据库的方法。

您甚至可以摆脱自定义的 MongoDbContainer 类,因为 Testcontainers 带有 dedicated Mongo module:

<dependency>
  <groupId>org.testcontainers</groupId>
  <artifactId>mongodb</artifactId>
  <scope>test</scope>
</dependency>

有多种方法可以覆盖测试的连接字符串,@DynamicPropertySource 是最方便的一种:

@Testcontainers
@SpringBootTest
class CustomerRepositoryTest 
 
  @Container
  static MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:4.4.2");
 
  @DynamicPropertySource
  static void setProperties(DynamicPropertyRegistry registry) 
    registry.add("spring.data.mongodb.uri", mongoDBContainer::getReplicaSetUrl);
  


有关更多详细信息,请参阅这篇MongoDB Testcontainers Setup for @DataMongoTest 文章。

【讨论】:

感谢您的回答。你知道我怎么会在运行测试时突然创建集合并将数据插入到这些集合中? 如果您使用Spring Data MongoDB,您可以使用任何存储库类插入数据,如果您需要低级别的 MongoDB 访问,请将MongoClient 注入您的测试并执行任何设置任务跨度>

以上是关于在容器上运行的 mongoDB 中创建集合和检索数据的方法的主要内容,如果未能解决你的问题,请参考以下文章

在现有 Docker 容器中创建现有 Mongo DB 数据库的连接

尝试使用 mongodb 插件在 grails 中创建 mongodb 集合

如何在不在 MongoDB 中创建集合的情况下创建 Mongoose 模型?

如何在不在 MongoDB 中创建集合的情况下创建 Mongoose 模型?

javascript 如何在MongoDb中创建一个集合?

MongoDB:如何使用 _id 获取集合中的最新文档?