我用Spring Boot研究过MongoDB

我用docker-compose安装了Mongo,用Mongo Compass与Mongo数据库交互,创建了产品数据库

version: "3.8"
services:
    mongodb:
        image : mongo
        container_name: mongodb
        environment:
        - PUID=1000
        - PGID=1000
        volumes:
        - ./database/product-service/mongodb:/data/db
        ports:
        - 27017:27017
        restart: unless-stopped

Spring Boot代码

控制器

@Rest控制器
@RequestMapping("/api/v1/product")
@RequiredArgsConstructor
public class Product控制器 {
    private final Product服务 product服务;

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public void createProduct(@RequestBody ProductRequest productRequest) {
        product服务.createProduct(productRequest);
    }

    @GetMapping
    @ResponseStatus(HttpStatus.OK)
    public List<ProductResponse> getAllProducts() {
        return product服务.getAllProducts();
    }
}

服务

@服务
@RequiredArgsConstructor
@Slf4j
public class Product服务 {
    private final ProductRepository productRepository;

    public void createProduct(ProductRequest productRequest) {
        Product product = Product.builder()
                .name(productRequest.getName())
                .description(productRequest.getDescription())
                .price(productRequest.getPrice())
                .build();
        productRepository.save(product);
        log.info("Product {} is saved", product.getId());
    }

    public List<ProductResponse> getAllProducts() {
        List<Product>products = productRepository.findAll();
        log.info("Get all products");
        return products.stream().map(product -> map2ProductResponse(product)).toList();
    }

    private ProductResponse map2ProductResponse(Product product) {
        return ProductResponse.builder()
                .id(product.getId())
                .name(product.getName())
                .description(product.getDescription())
                .price(product.getPrice())
                .build();
    }
}

实体

@Document(value = "product")
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
public class Product {
    private String id;
    private String name;
    private String description;
    private BigDecimal price;
}

使用Spring Boot应用程序,我对appllication.properties文件进行了这样的配置

spring.data.mongodb.uri=mongodb://127.0.0.1:27017/product

因为我找到了大约posts

我试着换成这个,没什么变化

spring.data.mongodb.port=27017
spring.data.mongodb.database=product
spring.data.mongodb.host=localhost

当我判断Mongo Compass时,它总是连接到test个数据库,尽管我指定了product个数据库,如Applation.Properties

enter image description here

我也找到了类似的question,我试过那个解决方案,它对我不起作用,这个解决方案对我来说太复杂了.它会引发错误

Error creating bean with name 'mongoConfig': Injection of autowired dependencies failed

我不能解决这个问题,因为我对Mongo还不熟悉

我如何才能更改春装应用程序连接到另一个数据库?

推荐答案

我已经试着读了几个小时的芒果docs,我已经找到了解决方案.

几乎所有的身份验证机制都不能设置数据库名称

例如,对于使用连接字符串或mongo凭据的默认身份验证机制,我看不到数据库名称的参数,只包括usernameauthenticationDbpassword

使用连接字符串:

MongoClient mongoClient = MongoClients
.create("mongodb://<username>:<password>@<hostname>:<port>/?authSource=<authenticationDb>");

与MongoCredential合作:

MongoCredential credential = MongoCredential.createCredential("<username>", "<authenticationDb>", "<password>");
MongoClient mongoClient = MongoClients.create(
    MongoClientSettings.builder()
        .applyToClusterSettings(builder ->
                builder.hosts(Arrays.asList(new ServerAddress("<hostname>", <port>))))
        .credential(credential)
        .build());

其他机制也是一样的.

因此,我try 创建配置文件


@Configuration
public class MongoDBConfig {
    @Bean
    public MongoClient mongoClient() {
        return MongoClients.create("mongodb://root:pass12345@127.0.0.1:27018");
    }
}

并在应用程序中添加数据库名称.属性

spring.data.mongodb.database=product

太神奇了,它的工作方式和我想的一样完美

Java相关问答推荐

使用Apache Poi MQLSlideShow,在XSLFTable表中,我们可以在文本段落后面的每个单元格中包含圆角矩形吗?

屏蔽字母数字代码的Java正则表达式

我找不到&Quot;配置&的位置

Com.google.firebase.database.DatabaseException:无法将类型为java.lang.Boolean的值转换为字符串.这是关于什么的?

SpringBoot Kafka自动配置-适用于SASL_PLAYTEXT的SSLBundle 包,带SCRAM-SHA-512

声明带有泛型的函数以用作查找映射中的值

将PNG转换为位图自定义十六进制字符串

解析方法";javax/imageio/metadata/IIOMetadata.getAsTree(Ljava/lang/String;)Lorg/w3c/dom/Node时加载约束冲突

在settings.gradle.kts和Build.gradle.kts中使用公共变量

基于配置switch 的@Controller的条件摄取

如何从HttpResponse实例获取Entity对象的内容?

组合连接以从两个表返回数据

在Java中将.GRF转换为图像文件

用于Java的Visual Studio代码完成不起作用

Java HashMap保留所有时间复杂性

在权限列表中找不到我的应用程序

当我将JTextField的getText函数与相等的String进行比较时;t返回true

OpenJDK20:JEP434:Foreign Function&;内存API(第二次预览)

Swagger.io OpenApi v3.0 声明默认媒体类型

对于 Hangman 游戏,索引 0 超出长度 0 的范围