SpringBoot集成MongoDB Query&BasicQuery Update&BasicUpdate示例

这篇博客介绍了如何使用Java Spring Boot和MongoDB Template进行数据库操作,包括增删改查的基本操作和复杂查询。通过记录Inventory和Size实体,展示了MongoDB的数据插入、查找、更新和删除。同时,文章还演示了使用Criteria和BasicQuery实现不同类型的查询,如等于、不等于、范围、正则表达式等条件的组合查询。
摘要由CSDN通过智能技术生成

上一篇:使用java客户端增删改查mongodb

pom依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

application.yml 配置文件:

spring:
  data:
    mongodb:
      uri: mongodb://localhost:27017/databaseName #无密码

新建Entity实体Inventory和SIze:(我用的是jdk14的record,或者可以直接手动生成构造器getter/setter)

public record Inventory(
        String _id, String item, int qty, Size size, String status) {
   
}
public record Size(double h, double w, String uom) {
   
}

最后MongoDBTest.java:

Query通过传入Criteria实现复杂的查询操作(下列每个方法中的注释掉的代码),而BasicQuery通过传入json字符串就可以执行查询,Update和BasicUpdate同理。传入的json字符串和命令行操作mongo是几乎一样的。而Update/Query的方式更接近于SQL操作,更直观更好记。

@SpringBootTest
public class DbTest {
   
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public void findAllInventories() {
   
        List<Inventory> all = mongoTemplate.findAll(Inventory.class);
        all.forEach(System.out::println);
    }

    @Test
    public void insertOne() {
   
        mongoTemplate.insert(
            new Inventory("", "paper", 100, new Size(8.5, 11, "in"), "D")
        );
    }

    @Test
    public void insertMany() {
   
        List<Inventory> list = Arrays.asList(
                new Inventory("", "canvas", 100, new Size
在Spring Boot结合MongoDB中实现动态数据模型,可以使用MongoDB的文档存储模型和Spring Boot的反射机制来实现。具体实现步骤如下: 1. 创建实体类时,使用`@Document`注解标注该实体类对应的MongoDB的集合名称。 2. 使用`@Field`注解标注实体类中需要动态添加的字段。 3. 创建一个`DynamicDocument`类,该类中包含一个`Map`类型的属性用于存储动态添加的字段以及对应的值。 4. 在需要动态添加字段的地方,通过Spring Boot的反射机制,将动态添加的字段和对应的值存储到`DynamicDocument`对象的`Map`属性中。 5. 将`DynamicDocument`对象存储到MongoDB中。 6. 当需要查询动态添加的字段时,可以使用MongoDB的`$exists`操作符来查询是否存在该字段。 7. 当需要更新动态添加的字段时,可以使用MongoDB的`$set`操作符来更新该字段的值。 需要注意的是,动态添加的字段在MongoDB中是以键值对的形式存储的,因此需要设计合适的键名和键值类型。另外,在使用动态数据模型时,需要注意数据的安全性和可维护性。 以下是一个简单的示例代码,演示如何在Spring Boot中实现动态数据模型: ```java import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; import java.util.Map; @Document(collection = "dynamic_collection") public class DynamicDocument { @Id private String id; @Field private Map<String, Object> fields; public String getId() { return id; } public void setId(String id) { this.id = id; } public Map<String, Object> getFields() { return fields; } public void setFields(Map<String, Object> fields) { this.fields = fields; } } ``` 在上面的代码中,我们创建了一个名为 DynamicDocument 的类,使用了`@Document`注解标注该类对应的MongoDB的集合名称。使用`@Field`注解标注了实体类中需要动态添加的字段,并将它们存储在一个`Map`类型的属性 fields 中。 接下来,我们可以通过 Spring Boot 的反射机制来动态添加字段和对应的值,示例代码如下: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.Map; @Service public class DynamicDocumentService { @Autowired private MongoTemplate mongoTemplate; public void saveDynamicDocument() { DynamicDocument document = new DynamicDocument(); Map<String, Object> fields = new HashMap<>(); fields.put("key1", "value1"); fields.put("key2", 123); document.setFields(fields); mongoTemplate.save(document); } } ``` 在上面的代码中,我们使用了`MongoTemplate`来保存`DynamicDocument`对象。我们在`DynamicDocument`对象中动态添加了两个字段,然后将整个`DynamicDocument`对象存储到MongoDB中。 当需要查询动态添加的字段时,可以使用MongoDB的`$exists`操作符来查询是否存在该字段。示例代码如下: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; @Service public class DynamicDocumentService { @Autowired private MongoTemplate mongoTemplate; public DynamicDocument getDynamicDocumentById(String id) { Query query = new Query(Criteria.where("_id").is(id).and("fields.key1").exists(true)); return mongoTemplate.findOne(query, DynamicDocument.class); } } ``` 在上面的代码中,我们通过`Criteria`来构建查询条件,使用`$exists`操作符来查询是否存在`key1`字段。然后使用`MongoTemplate`执行查询操作,并返回找到的`DynamicDocument`对象。 当需要更新动态添加的字段时,可以使用MongoDB的`$set`操作符来更新该字段的值。示例代码如下: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Service; @Service public class DynamicDocumentService { @Autowired private MongoTemplate mongoTemplate; public void updateDynamicDocument(String id, String key, Object value) { Query query = new Query(Criteria.where("_id").is(id)); Update update = new Update().set("fields." + key, value); mongoTemplate.updateFirst(query, update, DynamicDocument.class); } } ``` 在上面的代码中,我们通过`Query`来构建查询条件,使用`Update`来构建更新操作,使用`$set`操作符来更新`key`字段的值。然后使用`MongoTemplate`执行更新操作。 需要注意的是,在使用动态数据模型时,需要考虑到数据的安全性和可维护性。建议在设计动态数据模型时,仅允许添加特定的字段,并对输入的数据进行验证和过滤,以防止恶意输入和数据不一致性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值