Springboot MongoDB CRUD(二)

该文章为 MongoTemplate 方式,基于 JPA(Repositories) 可见文章 Springboot MongoDB CRUD(一)

概述

MongoDB 描述等可见其他文章, 本文章主要基于 springboot 项目演示

  • MongoDB 安装[Mac brew & Docker 方式]

  • MongoDB 基础概述

  • MongoDB Shell CRUD

版本信息:

  • Java JDK 版本:1.8

  • SpringBoot 版本:2.4.5.RELEASE

  • MongoDB 版本:community-4.4

参考地址:

  • MongoDB 官方网址

  • Spring Data MongoDB 官方文档 3.0.9.RELEASE

示例项目地址:

  • SpringBoot 集成 MongoDB 示例项目 Github 地址

前置条件

以下例子需先创建库,故先手动创建好,可通过脚本或者客户端,自行选择。

# 切换到 test
use test

# 创建 est 授权 读&写&管理权限
db.createUser( {user: "test",pwd: "123456",roles: [ { role: "readWrite", db: "test" },{ role: "dbAdmin", db: "test" }]});

项目实战

SpringBoot 操作主要有两种方式,一种基于 JPA(Repositories)、一种基于MongoDB 官方 Java 驱动 MongoTemplate,直接用代码说话吧。(该文章为 MongoTemplate 方式)

项目构建等忽略, gradle 构建,配置文件:

plugins {
    id 'org.springframework.boot' version '2.4.5'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.xjxxxc.mongodb.demo'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenLocal()
    maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
    implementation 'com.google.guava:guava:30.1.1-jre'
    implementation 'org.apache.commons:commons-lang3'
    implementation 'com.alibaba:fastjson:1.2.76'

    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
    annotationProcessor 'org.projectlombok:lombok'

    testAnnotationProcessor 'org.projectlombok:lombok:1.18.20'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation 'org.projectlombok:lombok'
}

test {
    useJUnitPlatform()
}

包说明:

├── com
│   └── xjxxxc
│       └── mongodb
│           └── demo
│               ├── MongodbDemoApplication.java # 启动类
│               ├── config # 配置类,如数据源
│               ├── listener # 监听器,如 MongoEvent
│               ├── model # 模型
│               │   └── entity # 实体,JPA 使用
│               ├── repository # JPA repository
│               ├── service # *服务层,提供 MongoDB 特性。
│               └── template # MongoDB 模板类使用 DEMO

项目基本配置

application.properties

server.port=8866
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=test
spring.data.mongodb.username=test
spring.data.mongodb.password=123456

根据情况修改即可,为了演示方便直接写在 application.properties

MongoDBDataSourceConfig

继承 AbstractMongoClientConfiguration 类,重写 mongoClient() 、getDatabaseName() 、mappingMongoConverter() 方法,并且去除 _class 字段。

@Configuration
@EnableMongoRepositories(basePackages = {"com.xjxxxc.mongodb.demo.*"})
public class MongoDBDataSourceConfig extends AbstractMongoClientConfiguration {
    @Value(value = "${spring.data.mongodb.host:127.0.0.1}")
    private String host;

    @Value(value = "${spring.data.mongodb.port:27017}")
    private Integer port;

    @Value(value = "${spring.data.mongodb.database:test}")
    private String database;

    @Value(value = "${spring.data.mongodb.username:test}")
    private String username;

    @Value(value = "${spring.data.mongodb.password:123456}")
    private String password;

    @Override
    public MongoClient mongoClient() {
        MongoClient mongoClient = MongoClients.create(
                MongoClientSettings.builder()
                        // 集群设置
                        .applyToClusterSettings(builder ->
                                builder.hosts(Arrays.asList(new ServerAddress(host, port))))
                        // 凭据
                        .credential(
                                MongoCredential
                                        .createCredential(username, database, password.toCharArray()))
                        .build());
        return mongoClient;
    }


    /**
     * Return the name of the database to connect to.
     *
     * @return must not be {@literal null}.
     */
    @Override
    protected String getDatabaseName() {
        return database;
    }

    /**
     * 去除 _class
     * @param databaseFactory
     * @param customConversions
     * @param mappingContext
     * @return MappingMongoConverter
     */
    @Override
    public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory databaseFactory, MongoCustomConversions customConversions, MongoMappingContext mappingContext) {

        DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory());
        MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mappingContext);
        converter.setCustomConversions(customConversions());
        converter.setCodecRegistryProvider(mongoDbFactory());
        // Don't save _class to mongo
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));

        return converter;
    }


}

MongoTemplate

这里使用 Spring Data MongoDB 封装的 MongoDB 官方 Java 驱动 MongoTemplate 对 MongoDB 进行操作。

MongoTemplateDemo

基于 MongoTemplate, 实现 CURD 外增加了复杂查询、排序、过滤、分页以及查询、创建索引等方法。

public class MongoTemplateDemo {
    public static final String INDEX_PREFIX = "idx_";

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 插入一条数据
     *
     * @param collectionName 集合名称
     * @param document       文档
     */
    public void insertOne(String collectionName, Document document) {
        mongoTemplate.getCollection(collectionName).insertOne(document);
    }

    /**
     * 批量插入数据
     *
     * @param collectionName 集合名称
     * @param documents      文档
     */
    public void insertMany(String collectionName, List documents) {
        mongoTemplate.getCollection(collectionName).insertMany(documents);
    }

    /**
     * 根据条件分页查询所有符合条件的结果,并指定返回字段
     *
     * @param collectionName 集合名称
     * @param query          过滤条件
     * @param projection     查询字段
     * @param sort           排序条件
     * @param skip           起始值
     * @param limit          限定数量
     * @return FindIterable
     */
    public FindIterable find(String collectionName, Document query, Document projection, Bson sort, int skip, int limit) {
        return mongoTemplate.getCollection(collectionName).find(query).projection(projection).sort(sort).skip(skip).limit(limit);
    }

    /**
     * 根据条件查询所有符合条件的结果,并指定返回字段
     *
     * @param collectionName 集合名称
     * @param query          过滤条件
     * @param projection     查询字段
     * @param sort           排序条件
     * @return FindIterable
     */
    public FindIterable find(String collectionName, Document query, Document projection, Document sort) {
        return mongoTemplate.getCollection(collectionName).find(query).projection(projection).sort(sort);
    }

    /**
     * 根据条件查询所有符合条件的结果,并指定返回字段
     *
     * @param collectionName 集合名称
     * @param query          过滤条件
     * @param projection     查询字段
     * @return FindIterable
     */
    public FindIterable find(String collectionName, Document query, Document projection) {
        return mongoTemplate.getCollection(collectionName).find(query).projection(projection);
    }

    /**
     * 根据条件查询所有符合条件的结果
     *
     * @param collectionName 集合名称
     * @param query          过滤条件
     * @return FindIterable
     */
    public FindIterable find(String collectionName, Document query) {
        return this.find(collectionName, query, null);
    }

    /**
     * 查询一个
     *
     * @param collectionName 集合名称
     * @param query          过滤条件
     * @return Document
     */
    public Document findOne(String collectionName, Document query) {
        FindIterable iterable = this.find(collectionName, query);
        MongoCursor mongoCursor = iterable.iterator();
        while (mongoCursor.hasNext()) {
            return mongoCursor.next();
        }
        return new Document();
    }


    /**
     * 分页查询
     *
     * @param collectionName 集合名称
     * @param query          过滤条件
     * @param skip           起始值
     * @param limit          限制条数
     * @return FindIterable
     */
    public FindIterable findPage(String collectionName, Document query, int skip, int limit) {
        return mongoTemplate.getCollection(collectionName).find(query).skip(skip).limit(limit);
    }

    /**
     * 查询条数
     *
     * @param collectionName
     * @param query
     * @return long
     */
    public long count(String collectionName, Document query) {
        return mongoTemplate.getCollection(collectionName).countDocuments(query);
    }

    /**
     * 删除一条
     *
     * @param collectionName
     * @param query
     * @return DeleteResult
     */
    public DeleteResult removeOne(String collectionName, Document query) {
        return mongoTemplate.getCollection(collectionName).deleteOne(query);
    }

    /**
     * 删除多条
     *
     * @param collectionName
     * @param query
     * @return DeleteResult
     */
    public DeleteResult removeMany(String collectionName, Document query) {
        return mongoTemplate.getCollection(collectionName).deleteMany(query);
    }


    /**
     * 修改一条
     *
     * @param collectionName
     * @param query
     * @param update
     * @return UpdateResult
     */
    public UpdateResult updateOne(String collectionName, Document query, Document update) {
        return mongoTemplate.getCollection(collectionName).updateOne(query, update);
    }

    /**
     * 修改多条
     *
     * @param collectionName
     * @param query
     * @param update
     * @return UpdateResult
     */
    public UpdateResult updateMany(String collectionName, Document query, Document update) {
        return mongoTemplate.getCollection(collectionName).updateMany(query, update);
    }

    /**
     * 替换 整个文档
     *
     * @param collectionName
     * @param query
     * @param update
     * @return UpdateResult
     */
    public UpdateResult replaceOne(String collectionName, Document query, Document update) {
        return mongoTemplate.getCollection(collectionName).replaceOne(query, update);
    }

    /**
     * 获取当前集合对应的所有索引的名称
     *
     * @param collectionName
     * @return List
     */
    public List getAllIndexes(String collectionName) {
        ListIndexesIterable list = mongoTemplate.getCollection(collectionName).listIndexes();
        //上面的list不能直接获取size,因此初始化arrayList就不设置初始化大小了
        List indexes = new ArrayList<>();
        for (Document document : list) {
            document.entrySet().forEach((key) -> {
                //提取出索引的名称
                if (key.getKey().equals("name")) {
                    indexes.add(key.getValue().toString());
                }
            });
        }
        return indexes;
    }

    /**
     * 创建索引
     *
     * @param collectionName
     * @param filedName      [默认升序索引]
     * @return String 索引名
     */
    public String createIndex(String collectionName, String filedName) {
        // TODO:检查是否已经有索引 getAllIndexes
        //该参数为索引的属性配置
        IndexOptions indexOptions = new IndexOptions();
        // 后台进行索引的创建
        indexOptions.background(true);
        indexOptions.name(INDEX_PREFIX + filedName);

        return mongoTemplate.getCollection(collectionName).createIndex(Indexes.ascending(filedName), indexOptions);
    }

    /**
     * 创建复合索引
     *
     * @param collectionName
     * @param filedNames     [默认升序索引]
     * @return String 索引名
     */
    public String createIndex(String collectionName, List filedNames) {
        // TODO:检查是否已经有索引 getAllIndexes
        //该参数为索引的属性配置
        IndexOptions indexOptions = new IndexOptions();
        // 后台进行索引的创建
        indexOptions.background(true);
        indexOptions.name(INDEX_PREFIX + filedNames.stream().collect(Collectors.joining("_")));

        return mongoTemplate.getCollection(collectionName).createIndex(Indexes.ascending(filedNames), indexOptions);
    }

}

MongoTemplateDemoTest

单元测试类,用来测试 MongoTemplateDemo 的方法。
大致描述下测试的方法

insertOneTest 插入一条数据

库中可查到数据:

{
    "_id": "1234567890",
    "name": "jason",
    "age": NumberInt("25"),
    "sex": "男"
}
insertManyTest

库中可查到数据:

{
    "_id": "1234567891",
    "name": "jason",
    "age": NumberInt("25"),
    "sex": "男"
}

{
    "_id": "1234567892",
    "name": "花花",
    "age": NumberInt("22"),
    "sex": "女"
}

findTestTest

控制台数据输出 _id = 1234567890 的文档。
Document{{_id=1234567890, name=jason, age=25, sex=男}}

findBySexTestTest

控制台数据输出 sex = 男 的文档。
Document{{_id=1234567890, name=jason, age=25, sex=男}}
Document{{_id=1234567891, name=jason, age=25, sex=男}}

findManyWithFieldTest

控制台数据输出 sex = 男 的文档。[仅显示 age 字段]
Document{{age=25}}
Document{{age=25}}

findManyWithPageTest

控制台数据输出前 5 条数据[示例只有 3 条],可结合批量生成测试数据的方法测试。
Document{{_id=1234567890, name=jason, age=25, sex=男}}
Document{{_id=1234567891, name=jason, age=25, sex=男}}
Document{{_id=1234567892, name=花花, age=22, sex=女}}

findManyWithInTest

控制台数据输出 _id in(1234567890, 1234567891,1234567892) 的文档(案例中所有数据)。
Document{{_id=1234567890, name=jason, age=25, sex=男}}
Document{{_id=1234567891, name=jason, age=25, sex=男}}
Document{{_id=1234567892, name=花花, age=22, sex=女}}

findManyWithOrTest

控制台数据输出 sex = 男 or age = 22 的文档(案例中所有数据)。
Document{{_id=1234567890, name=jason, age=25, sex=男}}
Document{{_id=1234567891, name=jason, age=25, sex=男}}
Document{{_id=1234567892, name=花花, age=22, sex=女}}

findManyWithGtTest

控制台数据输出 age > 21 and age < 24 的文档。
Document{{_id=1234567892, name=花花, age=22, sex=女}}

findManyWithPatternTest

控制台数据输出 name like '%花%'' 的文档。
Document{{_id=1234567892, name=花花, age=22, sex=女}}

countTest

控制台数据输出 sex = 男 的合计。
输出 2

updateOneTest

修改 _id = 1234567891 的 age = 1
修改前数据:

{
    "_id": "1234567891",
    "name": "jason",
    "age": NumberInt("25"),
    "sex": "男"
}

修改后数据:

{
    "_id": "1234567891",
    "name": "jason",
    "age": NumberInt("1"),
    "sex": "男"
}
updateManyTest

修改 name = jason 的 age = 26
修改前数据:

{
    "_id": "1234567890",
    "name": "jason",
    "age": NumberInt("25"),
    "sex": "男"
}

{
    "_id": "1234567891",
    "name": "jason",
    "age": NumberInt("1"),
    "sex": "男"
}

修改后数据:

{
    "_id": "1234567890",
    "name": "jason",
    "age": NumberInt("26"),
    "sex": "男"
}

{
    "_id": "1234567891",
    "name": "jason",
    "age": NumberInt("26"),
    "sex": "男"
}
updateOneInObjectTest

修改 _id = 1234567892 的数据,$set university 的键值。
修改前数据:

{
    "_id": "1234567892",
    "name": "花花",
    "age": NumberInt("22"),
    "sex": "女"
}

修改后数据:

{
    "_id": "1234567892",
    "name": "花花",
    "age": NumberInt("22"),
    "sex": "女",
    "university": {
        "name": "SZU",
        "address": "SZ"
    }
}
updateOnePushListTest

修改 name = BAT 的数据,插入 workExperience 的文档 。
修改前数据:

{
    "_id": "1234567892",
    "name": "花花",
    "age": NumberInt("22"),
    "sex": "女",
    "university": {
        "name": "SZU",
        "address": "SZ"
    }
}

修改后数据:

{
    "_id": "1234567892",
    "name": "花花",
    "age": NumberInt("22"),
    "sex": "女",
    "university": {
        "name": "SZU",
        "address": "SZ"
    },
    "workExperience": [
        {
            "startDate": "2013-09",
            "endDate": "2017-09",
            "address": "SZ",
            "name": "BAT"
        }
    ]
}
updateOneInListTest

修改 workExperience.name = BAT 的 workExperience.$.address = SZ.NS 。[案例只有一条]
修改前数据:

{
    "_id": "1234567892",
    "name": "花花",
    "age": NumberInt("22"),
    "sex": "女",
    "university": {
        "name": "SZU",
        "address": "SZ"
    },
    "workExperience": [
        {
            "startDate": "2013-09",
            "endDate": "2017-09",
            "address": "SZ",
            "name": "BAT"
        }
    ]
}

修改后数据:

{
    "_id": "1234567892",
    "name": "花花",
    "age": NumberInt("22"),
    "sex": "女",
    "university": {
        "name": "SZU",
        "address": "SZ"
    },
    "workExperience": [
        {
            "startDate": "2013-09",
            "endDate": "2017-09",
            "address": "SZ.NS",
            "name": "BAT"
        }
    ]
}
replaceOne

替换 _id = 1234567891 的文档数据。
修改前数据:

{
    "_id": "1234567891",
    "name": "jason",
    "age": NumberInt("26"),
    "sex": "男"
}

修改后数据:

{
    "_id": "1234567891",
    "name": "replace name",
    "age": NumberInt("22"),
    "sex": "女"
}
removeOne

删除 _id = 1234567890 的文档数据。
修改前数据:

{
    "_id": "1234567890",
    "name": "jason",
    "age": NumberInt("26"),
    "sex": "男"
}

修改后数据:

// 空文档
{
}
removeMany

删除 _id in (1234567891,1234567892) 的文档数据。
修改前数据:

{
    "_id": "1234567891",
    "name": "replace name",
    "age": NumberInt("22"),
    "sex": "女"
}

{
    "_id": "1234567892",
    "name": "花花",
    "age": NumberInt("22"),
    "sex": "女",
    "university": {
        "name": "SZU",
        "address": "SZ"
    },
    "workExperience": [
        {
            "startDate": "2013-09",
            "endDate": "2017-09",
            "address": "SZ.NS",
            "name": "BAT"
        }
    ]
}

修改后数据:

// 空文档
{
}
代码
class MongoTemplateDemoTest {

    @Autowired
    private MongoTemplateDemo mongoTemplateDemo;

    // test_template
    private String collectionName = "test_template";

    /**
     * 插入一条数据
     */
    @Test
    void insertOneTest() {
        Document document = new Document();
        document.put("_id", "1234567890");
        document.put("name", "jason");
        document.put("age", 25);
        document.put("sex", "男");
        mongoTemplateDemo.insertOne(collectionName, document);
    }

    /**
     * 插入多条数据
     */
    @Test
    void insertManyTest() {
        Document document = new Document();
        document.put("_id", "1234567891");
        document.put("name", "jason");
        document.put("age", 25);
        document.put("sex", "男");
        Document document2 = new Document();
        document2.put("_id", "1234567892");
        document2.put("name", "花花");
        document2.put("age", 22);
        document2.put("sex", "女");
        List list = new ArrayList<>();
        list.add(document);
        list.add(document2);
        mongoTemplateDemo.insertMany(collectionName, list);

    }

    /**
     * 查询符合条件的一条数据
     */
    @Test
    void findTest() {
        Document document = new Document();
        document.put("_id", "1234567890");
        //document.put("name","花花");
        FindIterable iterable = mongoTemplateDemo.find(collectionName, document);
        MongoCursor mongoCursor = iterable.iterator();
        while (mongoCursor.hasNext()) {
            Document result = mongoCursor.next();
            System.out.println(result);
            //System.out.println(result.toJson());
        }
    }

    /**
     * 查询符合条件的多条数据
     */
    @Test
    void findBySexTest() {

        Document document = new Document();
        document.put("sex", "男");
        FindIterable iterable = mongoTemplateDemo.find(collectionName, document);
        MongoCursor mongoCursor = iterable.iterator();
        while (mongoCursor.hasNext()) {
            Document result = mongoCursor.next();
            System.out.println(result);
        }
    }

    /**
     * 查询符合条件的数据,指定返回字段
     */
    @Test
    public void findManyWithFieldTest() {
        Document document = new Document();
        document.put("sex", "男");
        Document fieldDocument = new Document();
        fieldDocument.put("_id", false);
        fieldDocument.put("age", true);
        FindIterable iterable = mongoTemplateDemo.find(collectionName, document, fieldDocument);
        MongoCursor mongoCursor = iterable.iterator();
        while (mongoCursor.hasNext()) {
            Document result = mongoCursor.next();
            System.out.println(result);
        }
    }

    /**
     * 查询多条数据,分页
     */
    @Test
    public void findManyWithPageTest() {
        Document document = new Document();
        FindIterable iterable = mongoTemplateDemo.findPage(collectionName, document, 0, 5);
        MongoCursor mongoCursor = iterable.iterator();
        while (mongoCursor.hasNext()) {
            Document result = mongoCursor.next();
            System.out.println(result);
        }
    }

    /**
     * $in 查询
     * 反向 $nin
     */
    @Test
    public void findManyWithInIdTest() {
        Document document = new Document();
        document.put("_id", new Document().append("$in", Arrays.asList("1234567890", "1234567891", "1234567892")));
        FindIterable iterable = mongoTemplateDemo.find(collectionName, document);
        MongoCursor mongoCursor = iterable.iterator();
        while (mongoCursor.hasNext()) {
            Document result = mongoCursor.next();
            System.out.println(result);
        }
    }

    /**
     * or 查询
     */
    @Test
    public void findManyWithOrTest() {
        Document document1 = new Document();//条件1
        document1.put("sex", "男");
        Document document2 = new Document();//条件2
        document2.put("age", 22);
        Document dbObject = new Document();
        dbObject.put("$or", Arrays.asList(document1, document2));//组合
        FindIterable iterable = mongoTemplateDemo.find(collectionName, dbObject);
        MongoCursor mongoCursor = iterable.iterator();
        while (mongoCursor.hasNext()) {
            Document result = mongoCursor.next();
            System.out.println(result);
        }
    }

    /**
     * $gt:大于
     * $lt:小于
     * $gte:大于等于
     * $lte:小于等于
     * $ne:不等于
     */
    @Test
    public void findManyWithGtTest() {
        Document document = new Document();
        //document.put("age" , new Document().append("$gt",21));
        document.put("age", new Document().append("$gt", 21).append("$lt", 24));
        FindIterable iterable = mongoTemplateDemo.find(collectionName, document);
        MongoCursor mongoCursor = iterable.iterator();
        while (mongoCursor.hasNext()) {
            Document result = mongoCursor.next();
            System.out.println(result);
        }
    }


    /**
     * 模糊查询
     * mongodb用的是正则表达式来进行模糊查询的
     * 

* Spring中不区分大小写的模糊查询: * //完全匹配 * Pattern pattern = Pattern.compile("^花$", Pattern.CASE_INSENSITIVE); * //右匹配 * Pattern pattern = Pattern.compile("^.*花$", Pattern.CASE_INSENSITIVE); * //左匹配 * Pattern pattern = Pattern.compile("^花.*$", Pattern.CASE_INSENSITIVE); * //模糊匹配 * Pattern pattern = Pattern.compile("^.*花.*$", Pattern.CASE_INSENSITIVE); */ @Test public void findManyWithPatternTest() { String name = "花"; Pattern pattern = Pattern.compile("^.*" + name + ".*$", Pattern.CASE_INSENSITIVE); Document document = new Document(); document.put("name", pattern); FindIterable iterable = mongoTemplateDemo.find(collectionName, document); MongoCursor mongoCursor = iterable.iterator(); while (mongoCursor.hasNext()) { Document result = mongoCursor.next(); System.out.println(result); } } /** * 统计条数 */ @Test void countTest() { Document document = new Document(); document.put("sex", "男"); long count = mongoTemplateDemo.count(collectionName, document); System.out.println(count); } /** * 更新一条数据 */ @Test void updateOneTest() { Document document = new Document(); document.put("_id", "1234567891"); Document updateDocument = new Document(); updateDocument.put("age", 1); Document setDocument = new Document(); setDocument.put("$set", updateDocument); mongoTemplateDemo.updateOne(collectionName, document, setDocument); } /** * 更新多条数据 */ @Test void updateManyTest() { Document document = new Document(); document.put("name", "jason"); Document updateDocument = new Document(); updateDocument.put("age", 26); Document setDocument = new Document(); setDocument.put("$set", updateDocument); mongoTemplateDemo.updateMany(collectionName, document, setDocument); } /** * 修改一条数据 修改文档中的对象 */ @Test public void updateOneInObjectTest() { Document document = new Document(); document.put("_id", "1234567892"); Document updateDocument = new Document(); updateDocument.put("name", "SZU"); updateDocument.put("address", "SZ"); Document setDocument = new Document(); setDocument.put("$set", new Document().append("university", updateDocument)); mongoTemplateDemo.updateOne(collectionName, document, setDocument); } /** * 向数组中添加一个对象 * 也是更新文档的内容 所以算update */ @Test public void updateOnePushListTest() { Document document = new Document(); document.put("_id", "1234567892");//查询条件 Document pushDocument = new Document();//要插入的内容 pushDocument.put("startDate", "2013-09"); pushDocument.put("endDate", "2017-09"); pushDocument.put("address", "SZ"); pushDocument.put("name", "BAT"); Document updateDocument = new Document();//要插入哪个list updateDocument.put("workExperience", pushDocument); Document setDocument = new Document(); setDocument.put("$push", updateDocument);//操作 mongoTemplateDemo.updateOne(collectionName, document, setDocument); } /** * 修改一条数据 修改文档数组中的对象 */ @Test public void updateOneInListTest() { Document document = new Document(); //document.put("_id", "1234567892"); Document elemMatchDocument = new Document(); elemMatchDocument.put("name", "BAT"); document.put("workExperience", new Document().append("$elemMatch", elemMatchDocument)); //Document result=documentQueryDao.findOne(document); 查询符合条件的数组 //以上为查询条件 Document updateDocument = new Document(); updateDocument.put("workExperience.$.address", "SZ.NS"); Document setDocument = new Document(); setDocument.put("$set", updateDocument); mongoTemplateDemo.updateOne(collectionName, document, setDocument); } /** * replace 替换: * 把符合条件的document换成replaceDocument * 不管以前document以前的内容是什么, * 替换之后 * replaceDocument是什么 数据库里面就是什么。 * 这样理解:就是把符合条件的document删除,插入replaceDocument。 */ @Test void replaceOne() { Document document = new Document(); document.put("_id", "1234567891"); Document replaceDocument = new Document(); replaceDocument.put("name", "replace name"); replaceDocument.put("age", 22); replaceDocument.put("sex", "女"); mongoTemplateDemo.replaceOne(collectionName, document, replaceDocument); } /** * 删除一条数据 */ @Test void removeOne() { Document document = new Document(); document.put("_id", "1234567890"); mongoTemplateDemo.removeOne(collectionName, document); } /** * 删除多条数据 */ @Test void removeMany() { Document document = new Document(); document.put("_id", new Document().append("$in", Arrays.asList("1234567891", "1234567892"))); mongoTemplateDemo.removeMany(collectionName, document); } }

下偏文章将继续封装演示一些高级的功能

备注:个人博客同步至。

你可能感兴趣的:(Springboot MongoDB CRUD(二))