MongoDB的3.x版本java驱动相对2.x做了全新的设计,类库和使用方法上有很大区别。例如用Document替换BasicDBObject、通过Builders类构建Bson替代直接输入$命令等,本文整理了基于3.2版本的常用增删改查操作的使用方法。为了避免冗长的篇幅,分为增删改、查询、聚合、地理索引等几部分。

创建一个maven项目,添加依赖

<dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.2.2</version>
</dependency>
</dependencies>

非maven项目可自行下载jar包

http://central.maven.org/maven2/org/mongodb/mongo-java-driver/3.2.2/mongo-java-driver-3.2.2.jar

创建基础代码测试连接

public class CudExamples {

	public static void main(String[] args) throws ParseException {
//根据实际环境修改ip和端口
MongoClient mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("lesson"); MongoCollection<Document> mc = database.getCollection("language");
//插入一个文档
mc.insertOne(new Document("oop", "java"));
System.out.println(mc.findOneAndDelete(new Document("oop", "java"))); mongoClient.close();
}
}

如果输出结果为Document{{_id=573099877bee0e1710d52f4b, oop=java}}表示环境配置正确。

改造CudExamples类以方便演示每种操作对集合的影响

public class CudExamples {

	public static void main(String[] args) throws ParseException {
MongoClient mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("lesson"); CudExamples client = new CudExamples(database);
client.show();
mongoClient.close();
} private MongoDatabase database;
public CudExamples(MongoDatabase database) {
this.database = database;
} public void show() {
MongoCollection<Document> mc = database.getCollection("language");
//每次执行前清空集合以方便重复运行
mc.drop(); mc.insertOne(new Document("oop", "java"));
printCollection("insert java", mc);
} //打印查询的结果集
public void printCollection(String doing, MongoCollection<Document> mc) {
System.out.println(doing);
FindIterable<Document> iterable = mc.find();
iterable.forEach(new Block<Document>() {
public void apply(final Document document) {
System.out.println(document);
}
});
System.out.println("------------------------------------------------------");
System.out.println();
}
}

如上面代码所示,把所有的操作集中在show()方法中演示,并且在执行后打印集合以观察对集合的影响。下面来填充show()方法,注意需要静态导入Updates.*

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

		mc.insertOne(new Document("oop", "java"));
printCollection("insert java", mc); //插入一个包含两个字段的文档
Document doc = new Document("oop", "csharp").append("copyright", "microsoft");
mc.insertOne(doc);
printCollection("insert csharp", mc); //查找并修改一个文档
mc.findOneAndReplace(new Document("oop", "java"), new Document("oop", "java").append("copyright", "oracle"));
printCollection("findAndReplace java", mc); //删除一个文档
mc.deleteOne(new Document("oop", "java"));
printCollection("delete java", mc); //删除全部文档
mc.deleteMany(new Document());
printCollection("delete all", mc); //重新插入测试文档
mc.insertOne(new Document("oop", "java").append("copyright", "oracle"));
mc.insertOne(new Document("oop", "csharp").append("copyright", "microsoft"));
printCollection("insert java,csharp and swift", mc); //$set 文档中存在指定字段则修改,没有则添加
mc.updateMany(new Document(), set("rank", 100));
printCollection("$set all rank 100", mc); //$unset 文档中存在指定字段则删除该字段
mc.updateOne(new Document("oop", "csharp"), unset("rank"));
printCollection("unset csharp rank", mc); //$inc 文档中存在指定字段则相加,没有则添加
mc.updateOne(new Document("oop", "csharp"), inc("rank", 30));
printCollection("$inc csharp rank 30", mc);
mc.updateOne(new Document("oop", "csharp"), inc("rank", 31));
printCollection("$inc csharp rank 31", mc); //$setOnInsert 在更新时指定upsert=true并实际触发了插入操作时生效
mc.updateOne(new Document("oop", "swift").append("copyright", "apple"), setOnInsert("rank", 100), new UpdateOptions().upsert(true));
printCollection("$setOnInsert rank 100 for swift", mc); //$mul 相乘
mc.updateOne(new Document("oop", "java"), mul("rank", 0.2));
printCollection("$mul java rank: 0.2", mc); //$rename 重命名
mc.updateMany(new Document(), rename("rank", "ranks"));
printCollection("$rename all rank to ranks", mc); //$min 取当前值和指定值之间比较小的
mc.updateMany(new Document(), min("ranks", 50));
printCollection("$min all ranks: 50", mc); //$max 取当前值和指定值之间比较大的
mc.updateMany(new Document(), max("ranks", 40));
printCollection("$max all ranks: 40", mc); //$currentDate
mc.updateMany(new Document("oop", "java"), currentDate("add"));
printCollection("$currentDate java", mc); //$currentTimestamp
mc.updateMany(new Document("oop", "java"), currentTimestamp("lastModified"));
printCollection("$currentTimestamp java", mc); //$addToSet 添加一个元素到不重复集合
mc.updateMany(new Document("oop", "java"), addToSet("keywords", "for"));
mc.updateMany(new Document("oop", "java"), addToSet("keywords", "for"));
printCollection("$addToSet java keywords: for", mc); //$addEachToSet 添加一组元素到不重复集合
mc.updateMany(new Document("oop", "java"), addEachToSet("keywords", Arrays.asList("while", "true", "do", "new", "override")));
mc.updateMany(new Document("oop", "java"), addEachToSet("keywords", Arrays.asList("while", "true", "do", "new", "override")));
printCollection("$addEachToSet java keywords: while,true,do,new,override", mc); //$popFirst 删除第一个元素
mc.updateMany(new Document("oop", "java"), popFirst("keywords"));
printCollection("$popFirst java keywords", mc); //$popLast 删除最后一个元素
mc.updateMany(new Document("oop", "java"), popLast("keywords"));
printCollection("$popLast java keywords", mc); //$pull 删除指定元素
mc.updateMany(new Document("oop", "java"), pull("keywords", "new"));
printCollection("$pull java keywords: new", mc); //$pullByFilter 根据Filters删除
mc.updateMany(new Document("oop", "java"), pullByFilter(Filters.gte("keywords", "true")));
printCollection("$pullByFilter java keywords: true", mc); //$pullAll 删除一组元素
mc.updateMany(new Document("oop", "java"), pullAll("keywords", Arrays.asList("while", "true", "do", "new", "override")));
printCollection("$pullAll java keywords", mc); //$push 添加一个元素到可重复集合
mc.updateMany(new Document("oop", "java"), push("scores", 89));
printCollection("$push java scores: 89", mc); //$pushEach 添加一组元素到可重复集合
mc.updateMany(new Document("oop", "java"), pushEach("scores", Arrays.asList(89, 90, 92)));
printCollection("$pushEach java scores: 89,90,92", mc); //在集合的指定位置插入一组元素
mc.updateMany(new Document("oop", "java"), pushEach("scores", Arrays.asList(11, 12, 13), new PushOptions().position(0)));
printCollection("$pushEach java scores: 11,12,13 at position 0", mc); //在集合的指定位置插入一组元素并倒序排列
mc.updateMany(new Document("oop", "java"), pushEach("scores", Arrays.asList(40, 41), new PushOptions().sort(-1)));
printCollection("$pushEach java scores: 40,41 and sort(-1)", mc); //在集合的指定位置插入一组元素, 倒序排列后保留前3个
mc.updateMany(new Document("oop", "java"), pushEach("scores", Arrays.asList(60, 61), new PushOptions().sort(-1).slice(3)));
printCollection("$pushEach java scores: 60,61 and sort(-1) and slice(3)", mc); //插入一组内嵌文档
Bson bson = pushEach("experts",
Arrays.asList(new Document("first", "Rod").append("last", "Johnson"),
new Document("first", "Doug").append("last", "Cutting")));
mc.updateOne(new Document("oop", "java"), bson);
printCollection("$pushEach", mc); //combine 组合Bson
bson = combine(set("author", "James Gosling"), set("version", "8.0"));
mc.updateOne(new Document("oop", "java"), bson);
printCollection("$combine", mc);

(完)

MongoDB-JAVA-Driver 3.2版本常用代码全整理(1) - 增删改的更多相关文章

  1. MongoDB-JAVA-Driver 3.2版本常用代码全整理(3) - 聚合

    MongoDB的3.x版本Java驱动相对2.x做了全新的设计,类库和使用方法上有很大区别.例如用Document替换BasicDBObject.通过Builders类构建Bson替代直接输入$命令等 ...

  2. MongoDB-JAVA-Driver 3.2版本常用代码全整理(2) - 查询

    MongoDB的3.x版本Java驱动相对2.x做了全新的设计,类库和使用方法上有很大区别.例如用Document替换BasicDBObject.通过Builders类构建Bson替代直接输入$命令等 ...

  3. MongoDB-JAVA-Driver 3.2版本常用代码全整理(4) - 地理空间索引

    MongoDB的3.x版本Java驱动相对2.x做了全新的设计,类库和使用方法上有很大区别.例如用Document替换BasicDBObject.通过Builders类构建Bson替代直接输入$命令等 ...

  4. MongoDB Java Driver操作指南

    MongoDB为Java提供了非常丰富的API操作,相比关系型数据库,这种NoSQL本身的数据也有点面向对象的意思,所以对于Java来说,Mongo的数据结构更加友好. MongoDB在今年做了一次重 ...

  5. Mongodb Java Driver 参数配置解析

    要正确使用Mongodb Java Driver,MongoClientOptions参数配置对数据库访问的并发性能影响极大. connectionsPerHost:与目标数据库能够建立的最大conn ...

  6. 单元测试系列之十:Sonar 常用代码规则整理(二)

    摘要:帮助公司部署了一套sonar平台,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分析,避免再次出现类似问题. 作者原创技术文章,转载请注明出处 ======== ...

  7. 单元测试系列之九:Sonar 常用代码规则整理(一)

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 摘要:公司部署了一套sonar,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分 ...

  8. BaseDao代码,用于连接数据库实行增删改查等操作

    在学习JavaWeb时会用到此代码,用于实行增删改查操作 1 package com.bdqn.dao; import java.sql.Connection; import java.sql.Dri ...

  9. 【温故知新】Java web 开发(四)JSTL 与 JDBC 的增删改查

    本篇开始使用 jstl 这个 jsp 的标签库,在同一个 Servlet 中实现处理 CRUD 请求,以及使用 jdbc 数据库基本操作.然后你会发现 Servlet 和 jdbc 还是有很多不方便之 ...

随机推荐

  1. 如何让LinearLayout也有类似Button的点击效果?

    有的时候,我们希望LinearLayout布局也有点击的效果,这时候我们不仅需要一个作为背景的selector,还要设置一些其它属性才行: android:clickable="true&q ...

  2. 防止特殊html字符的问题(xxs攻击)方法

    快速对字符转义,避免跨站攻击XSS   XSS已经成为非常流行的网站攻击方式,为了安全起见,尽量避免用户的输入.可是有些情况下不仅不避免,反而要求鼓励输入,比如写博客.博客园开放性很高,可以运行手写的 ...

  3. Python条件语句

    1.简介 多个条件判断,用elif语句. 如果判断需要多个条件需同时判断时,可以使用 or (或),表示两个条件有一个成立时判断条件成功: 使用 and (与)时,表示只有两个条件同时成立的情况下,判 ...

  4. IOS学习笔记34—EGOTableViewPullRefresh实现下拉刷新

    移动应用开发中有这么一种场景,就是在列表中显示的数据刷新,有点击刷新按钮刷新的,也有现在最流行的由Twitter首先推出的下拉刷新功能,在IOS中,使用下拉刷新更新UITableView中的数据也用的 ...

  5. sql语句与 数据库

    create  table  wyx( xh int primary key, xm varchar(20) not null, nl int, zcrq timestamp default curr ...

  6. Visual Studio 启动修复命令

    今天VS启动不了了,连命令行的 devenv.exe /? 都执行不了,看不到帮助命令了,记性不好,以前看过但没记住呀,还好我装了两个不同版本的VS, 另一个VS的帮助命令还是可以看到的.虽然修复了, ...

  7. 装个centos虚拟机之设置桥接网络

    问题1:设置静态ip 虚拟机网路选择桥接后,设置静态ip: (1):先看下当前用的哪个网络 (2):打开配置文件,修改内容 内容参照mac配置,(注意:mac网络配置里的路由器就是默认网关GATEWA ...

  8. Android AChartEngine 个性化设置

    AChartEngine的确是一个强大的图标引擎,但文档写得不是很详细,很多设置只能通过方法名推测和实际尝试,下面是一些自己在实际中遇到的需要设置的选项,常见的那些和通过方法名就能轻松猜到的就不赘述了 ...

  9. English sentence

    For a better environment, we should teach our children to put litter/garbage/trash into dustbin/dust ...

  10. 黄聪:MYSQL使服务器内存CPU占用过高问题的分析及解决方法

    方法一: 使用 show processlist 语句,查找负荷最重的 SQL 语句,优化该SQL,比如适当建立某字段的索引. 方法二: #查看慢SQL日志是否启用mysql> show var ...