前言

  我是MongoDB小白,刚开始学。不过,我猜大多数使用MongoDB的,都是采用映射方式处理的,即需要有定义好的用于映射的实体类。但是这样的话,如果表的结构在未来可能频繁变动,增删字段,甚至添加新的数据表。那么这种方式就不太好用了。这时候就需要用非映射的方式处理。

映射方式操作Document

  这种方式最常见,一般就是预定义一些映射的实体类,然后打上@Ducument注解。在使用MongoTemplate的查询文档的时候,一般就是根据查询语句创建一个Query对象,然后用MongoTemplate.find(query, entityClass)这样的方式,就可以返回对应的实体对象集合。这样的例子非常多,我这里就不贴代码了。

非映射方式操作Document

  非映射方式操作Document,就是不需要预定义实体类,也就是没有实体类。我们只需要JSON数据就可以了。而刚好Document对象有提供toJson方法,可以返回一个JSON字符串。非映射方式不能直接用MongoTemplate直接find,而是要先获取集合对象,然后,在集合内部,相当于在表内部查询。

 例子如下:

public String findTest() {
//1.获取集合对象
MongoCollection<Document> collection = mongoTemplate.getCollection("test");
//2.创建用于查询的BSON对象
Bson bson = eq("field", "value");
//3.利用bson条件查询结果
FindIterable<Document> documents = collection.find(bson);
//4.将结果拼接成json数组
StringBuilder sb = new StringBuilder();
sb.append("[");
for(Document document : documents) {
sb.append(document.toJson() + ",\n");
}
sb.append("]");
return sb.toString();
}

可用的工具包 

  其中,eq()方法是Mongo Spring Boot整合包提供的。它表示条件:当文档的某个字段等于某个值的时候,文档被选中。这个方法是Filters的静态方法,如果要直接调用,可以通过静态引入:

import static com.mongodb.client.model.Filters.*;

这个类中,有很多用于过滤的方法。如eq(),ne(),gt(),lt(),in()等等更查询条件有关的。

如果你需要用于更新的方法,那么你可导入Updaters的静态方法,如set(),unSet(),rename()等等。

例子:

//注意key必须是字符串,而value可以是任意类型
Bson udpateBson = set("key", "value");

以上就是把文档的某个字段的值改为设定的值。

注:这两个类都来自mongodb-driver-core.jar包的com.mongodb.client.model目录下,想看更多功能可自行查看。

如何结合查询和更新的bson来执行一个更新操作呢?

  前面的更新bson,只说明了怎么更新,而没有说明要更新谁。而一个更新操作,必然包含查询,和修改两个操作。那么如何整合两个bson来使用呢?案例如下:

//查询条件
Bson searchBson = eq("job", "programmer");
//修改操作
Bson uddateBson = set("label", "666");
//修改所有符合条件的文档
collection.updateMany(searchBson, uddateBson);

【API知识】MongoTemplate非映射方式操作Document的更多相关文章

  1. 百度地图Api进阶教程-实例高级操作8.html

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  2. Elasticsearch学习系列之单模式下API的增删改查操作

    这里我们通过Elasticsearch的marvel插件实现单模式下API的增删改查操作 索引的初始化操作 创建索引之前可以对索引进行初始化操作,比如先指定shard数量以及replicas的数量 代 ...

  3. 操作Document文档

    利用客户端操作Document文档数据 1.创建一个文档(创建数据的过程,向表中去添加数据) 请求方式:Post 请求地址:es所在IP:9200/索引库/Type/文档ID(可给可不给,代表唯一标识 ...

  4. C#参数化执行SQL语句,防止漏洞攻击本文以MySql为例【20151108非查询操作】

    为什么要参数化执行SQL语句呢? 一个作用就是可以防止用户注入漏洞. 简单举个列子吧. 比如账号密码登入,如果不用参数, 写的简单点吧,就写从数据库查找到id和pw与用户输入一样的数据吧 sql:se ...

  5. PHP 向 MySql 中数据修改操作时,只对数字操作有效,非数字操作无效,怎么办?

    问题描述:   用PHP向MySql数据库中修改数据,实现增删改(数据库能正确连接) 经测试,代码只能对数字进行正常的增删改操作,非数字操作无效   但要在课程名称中输入中文,应该如果修改呢?   存 ...

  6. 05_Elasticsearch 单模式下API的增删改查操作

    05_Elasticsearch 单模式下API的增删改查操作 安装marvel 插件: zjtest7-redis:/usr/local/elasticsearch-2.3.4# bin/plugi ...

  7. Elasticsearch 单模式下API的增删改查操作

    <pre name="code" class="html">Elasticsearch 单模式下API的增删改查操作 http://192.168. ...

  8. ARM非对齐操作异常解决过程

    在测试MF固件时,发生一个非常诡异的异常,代码如下: CLR_DBG_Commands::Monitor_EraseMemory* cmd = (CLR_DBG_Commands::Monitor_E ...

  9. Java8 新特性 Stream 非短路终端操作

    非短路终端操作 Java8 新特性 Stream 练习实例 非短路终端操作,就是所有的元素都遍厉完,直到最后才结束.用来收集成自己想要的数据. 方法有: 遍厉 forEach 归约 reduce 最大 ...

随机推荐

  1. Thinkphp5 表单提交额外参数和页面跳转参数传递url

    1. 表单提交 <input type="hidden" name="project_name" value="$project_name&qu ...

  2. 服务器重新启动,ftp重新连接问题

    服务器重新启动,发现FlashFXP无法连接了,估计是ftp没有启动, 1. 首先服务器要安装ftp软件,查看是否已经安装ftp软件下:   #which vsftpd   如果看到有vsftpd的目 ...

  3. Oracle 触发器和序列的创建和使用 (自动增长列)

    -- 创建序列 create sequence 序列名称        start with 1 -- 起始值        increment by 1 -- 增量        maxvalue ...

  4. solr7.7.0搜索引擎使用(二)(添加搜索)

    一.安装完毕之后,需要为solr添加core,每一个搜索server就是一个core,solr可以有很多core,我们需要创建一个core用于我们的搜索 添加core的方式有两种: 第一种进入solr ...

  5. centos7.2 下 nginx 开机启动

    1.在系统服务目录里创建nginx.service文件 1 vi /lib/systemd/system/nginx.service 内容如下 1 2 3 4 5 6 7 8 9 10 11 12 1 ...

  6. VMware虚拟机网络设置

    背景介绍 在用 VMware workstation 安装好虚拟机后,需要给虚拟机配置网络,配置网络的方法有桥接.NAT.    采用桥接的方法需要占据物理机网段的ip地址,可能会与物理机同一网段的其 ...

  7. MD5盐值加密

    加密思路 思路解析:(数据解析过程基于16进制来处理的,加密后为16进制字符串) 加密阶段: 对一个字符串进行MD5加密,我们需要使用到MessageDigest(消息摘要对象),需要一个盐值(sal ...

  8. 《Pro git》

    可以通过阅读 CODING 工程师参与翻译的 <Pro Git> 进一步掌握 Git 版本控制系统. https://git-scm.com/book/zh/v2

  9. Dynamic Programming | Set 1 (Overlapping Subproblems Property)

    动态规划是这样一种算法范式:将复杂问题划分为子问题来求解,并且将子问题的结果保存下来以避免重复计算.如果一个问题拥有以下两种性质,则建议使用动态规划来求解. 1 重叠子问题(Overlapping S ...

  10. Win32 CMD批处理命令

    1. win32批处理下,另开一个console执行进程X 使用start [/K|/C],示例: //------------------------------------------------ ...