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

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

先看用于演示的类的基本代码

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

import java.text.ParseException;
import java.util.Arrays;

import org.bson.BsonType;
import org.bson.Document;

import com.mongodb.Block;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Projections;

public class FindExamples {

	public static void main(String[] args) throws ParseException {
		//根据实际环境修改ip和端口
		MongoClient mongoClient = new MongoClient("localhost", 27017);
		MongoDatabase database = mongoClient.getDatabase("lesson");

		FindExamples client = new FindExamples(database);
		client.show();
		mongoClient.close();
	}

	private MongoDatabase database;
	public FindExamples(MongoDatabase database) {
		this.database = database;
	}

	public void show() {
		MongoCollection<Document> mc = database.getCollection("blog");
		//每次执行前清空集合以方便重复运行
		mc.drop();

		//插入用于测试的文档
		Document doc1 = new Document("title", "good day").append("owner", "tom").append("words", 300)
				.append("comments", Arrays.asList(new Document("author", "joe").append("score", 3).append("comment", "good"), new Document("author", "white").append("score", 1).append("comment", "oh no")));
		Document doc2 = new Document("title", "good").append("owner", "john").append("words", 400)
				.append("comments", Arrays.asList(new Document("author", "william").append("score", 4).append("comment", "good"), new Document("author", "white").append("score", 6).append("comment", "very good")));
		Document doc3 = new Document("title", "good night").append("owner", "mike").append("words", 200)
				.append("tag", Arrays.asList(1, 2, 3, 4));
		Document doc4 = new Document("title", "happiness").append("owner", "tom").append("words", 1480)
				.append("tag", Arrays.asList(2, 3, 4));
		Document doc5 = new Document("title", "a good thing").append("owner", "tom").append("words", 180)
				.append("tag", Arrays.asList(1, 2, 3, 4, 5));
		mc.insertMany(Arrays.asList(doc1, doc2, doc3, doc4, doc5));

		//测试: 查询全部
		FindIterable<Document> iterable = mc.find();
		printResult("find all", iterable);

		//TODO: 将在这里填充更多查询示例
	}

	//打印查询的结果集
	public void printResult(String doing, FindIterable<Document> iterable) {
		System.out.println(doing);
        iterable.forEach(new Block<Document>() {
            public void apply(final Document document) {
                System.out.println(document);
            }
        });
        System.out.println("------------------------------------------------------");
        System.out.println();
	}
}

如上面代码所示,把所有的查询操作集中在show()方法中演示,并且在执行后打印结果集以观察查询结果。下面来填充show()方法

//创建单字段索引
mc.createIndex(new Document("words", 1));
//创建组合索引(同样遵循最左前缀原则)
mc.createIndex(new Document("title", 1).append("owner", -1));
//创建全文索引
mc.createIndex(new Document("title", "text"));

//查询全部
FindIterable<Document> iterable = mc.find();
printResult("find all", iterable);

//查询title=good
iterable = mc.find(new Document("title", "good"));
printResult("find title=good", iterable);

//查询title=good and owner=tom
iterable = mc.find(new Document("title", "good").append("owner", "tom"));
printResult("find title=good and owner=tom", iterable);

//查询title like %good% and owner=tom
iterable = mc.find(and(regex("title", "good"), eq("owner", "tom")));
printResult("find title like %good% and owner=tom", iterable);

//查询全部按title排序
iterable = mc.find().sort(ascending("title"));
printResult("find all and ascending title", iterable);

//查询全部按owner,title排序
iterable = mc.find().sort(ascending("owner", "title"));
printResult("find all and ascending owner,title", iterable);

//查询全部按words倒序排序
iterable = mc.find().sort(descending("words"));
printResult("find all and descending words", iterable);

//查询owner=tom or words>350
iterable = mc.find(new Document("$or", Arrays.asList(new Document("owner", "tom"), new Document("words", new Document("$gt", 350)))));
printResult("find owner=tom or words>350", iterable);

//返回title和owner字段
iterable = mc.find().projection(include("title", "owner"));
printResult("find all include (title,owner)", iterable);

//返回除title外的其他字段
iterable = mc.find().projection(exclude("title"));
printResult("find all exclude title", iterable);

//不返回_id字段
iterable = mc.find().projection(excludeId());
printResult("find all excludeId", iterable);

//返回title和owner字段且不返回_id字段
iterable = mc.find().projection(fields(include("title", "owner"), excludeId()));
printResult("find all include (title,owner) and excludeId", iterable);

//内嵌文档匹配
iterable = mc.find(new Document("comments.author", "joe"));
printResult("find comments.author=joe", iterable);

//一个错误的示例, 想查询评论中包含作者是white且分值>2的, 返回结果不符合预期
iterable = mc.find(new Document("comments.author", "white").append("comments.score", new Document("$gt", 2)));
printResult("find comments.author=white and comments.score>2 (wrong)", iterable);

//上面的需求正确的写法
iterable = mc.find(Projections.elemMatch("comments", Filters.and(Filters.eq("author", "white"), Filters.gt("score", 2))));
printResult("find comments.author=white and comments.score>2 using elemMatch", iterable);

//查找title以good开头的, 并且comments只保留一个元素
iterable = mc.find(Filters.regex("title", "^good")).projection(slice("comments", 1));
printResult("find regex ^good and slice comments 1", iterable);

//全文索引查找
iterable = mc.find(text("good"));
printResult("text good", iterable);

//用Filters构建的title=good
iterable = mc.find(eq("title", "good"));
printResult("Filters: title eq good", iterable);

//$in 等同于sql的in
iterable = mc.find(in("owner", "joe", "john", "william"));
printResult("Filters: owner in joe,john,william", iterable);

//$nin 等同于sql的not in
iterable = mc.find(nin("owner", "joe", "john", "tom"));
printResult("Filters: owner nin joe,john,tom", iterable);

//查询内嵌文档
iterable = mc.find(in("comments.author", "joe", "tom"));
printResult("Filters: comments.author in joe,tom", iterable);

//$ne 不等于
iterable = mc.find(ne("words", 300));
printResult("Filters: words ne 300", iterable);

//$and 组合条件
iterable = mc.find(and(eq("owner", "tom"), gt("words", 300)));
printResult("Filters: owner eq tom and words gt 300", iterable);

//较复杂的组合
iterable = mc.find(and(or(eq("words", 300), eq("words", 400)), or(eq("owner", "joe"), size("comments", 2))));
printResult("Filters: (words=300 or words=400) and (owner=joe or size(comments)=2)", iterable);

//查询第2个元素值为2的数组
iterable = mc.find(eq("tag.1", 2));
printResult("Filters: tag.1 eq 2", iterable);

//查询匹配全部值的数组
iterable = mc.find(all("tag", Arrays.asList(1, 2, 3, 4)));
printResult("Filters: tag match all (1, 2, 3, 4)", iterable);

//$exists
iterable = mc.find(exists("tag"));
printResult("Filters: exists tag", iterable);

iterable = mc.find(type("words", BsonType.INT32));
printResult("Filters: type words is int32", iterable);

这里列出的查询方式可以覆盖到大部分开发需求,更多查询需求请参考官方文档。

(完)

时间: 2024-10-09 09:19:33

MongoDB-JAVA-Driver 3.2版本常用代码全整理(2) - 查询的相关文章

MongoDB-JAVA-Driver 3.2版本常用代码全整理(1) - 增删改

转载,原文连接: http://blog.csdn.net/autfish/article/details/51356537 MongoDB的3.x版本Java驱动相对2.x做了全新的设计,类库和使用方法上有很大区别.例如用Document替换BasicDBObject.通过Builders类构建Bson替代直接输入$命令等,本文整理了基于3.2版本的常用增删改查操作的使用方法.为了避免冗长的篇幅,分为增删改.查询.聚合.地理索引等几部分. 创建一个maven项目,添加依赖 [java] vie

Android--新手必备的常用代码片段整理(二)

收集设备信息用于信息统计分析 是否有SD卡 动态隐藏软键盘 动态显示软键盘 动态显示或者是隐藏软键盘 主动回到Home后台运行 获取状态栏高度 获取状态栏高度标题栏ActionBar高度 获取MCCMNC代码 SIM卡运营商国家代码和运营商网络代码 返回移动网络运营商的名字 返回移动终端类型 判断手机连接的网络类型2G3G4G 判断当前手机的网络类型WIFI还是234G 收集设备信息,用于信息统计分析 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

Java学习不走弯路教程(14 代码结构整理)

代码结构整理 一. 前言 在前上一章教程中,介绍了和浏览器的通讯.本章将在上一章的基础上,进一步扩展程序. 注:1.本文针对初学Java的同学训练学习思路,请不要太纠结于细节问题.2.本文旨在达到抛砖引玉的效果,希望大家扩展本例子,以学到更多知识的精髓. 学习本章需要准备的知识:1.读完本系列教程的前面章节.二. 步入正题 话不多说,大家自己理解,下面步入正题: 为了在后面的课程中走的更远,我们来整理一下代码的结构. 首先我们把业务逻辑都放在app包下,并且将这个包分为三层,web,servic

Sonar 常用代码规则整理

摘要:公司部署了一套sonar,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分析,避免再次出现类似问题. 作者原创技术文章,转载请注明出处id: 83 name: A method/constructor shouldnt explicitly throw java.lang.Exception type: CODE SMELL severity: MAJOR Comment: It is unclear which exceptions that can b

iOS开发常用代码片段整理

1.判断邮箱格式是否正确的代码 //利用正则表达式验证 -(BOOL)isValidateEmail:(NSString *)email { NSString *emailRegex = @"[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES%@&quo

Android--新手必备的常用代码片段整理(一)

拨打电话 跳转至拨号界面 发送短信 唤醒屏幕并解锁 判断当前App处于前台还是后台状态 判断当前手机是否处于锁屏睡眠状态 判断当前是否有网络连接 判断当前是否是WIFI连接状态 安装APK 判断当前设备是否为手机 获取当前设备宽高单位px 获取当前设备的IMEI需要与上面的isPhone一起使用 获取当前设备的MAC地址 获取当前程序的版本号 拨打电话 1 2 3 public static void call(Context context, String phoneNumber) { con

【凯子哥带你夯实应用层】新手必备的常用代码片段整理(一)

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 以下内容来自多个开源项目的整理和自己的项目积累 拨打电话 跳转至拨号界面 发送短信 唤醒屏幕并解锁 判断当前App处于前台还是后台状态 判断当前手机是否处于锁屏睡眠状态 判断当前是否有网络连接 判断当前是否是WIFI连接状态 安装APK 判断当前设备是否为手机 获取当前设备宽高单位px 获取当前设备的IMEI需要与上面的isPhone一起使用 获取当前设备的MAC地址 获取当前程序的版本号 拨打电话 pu

MongoDB Java使用指南

引入MongoDB Java Driver包 如果需要操作MongoDB的Java项目是一个Maven项目,可以在依赖中加上以下的配置. <dependencies> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>2.13.2</version> </depen

Eclipse中的快捷键快速生成常用代码(例如无参、带参构造,set、get方法),以及Java中重要的内存分析(栈、堆、方法区、常量池)

Eclipse中的快捷键快速生成常用代码(例如无参.带参构造,set.get方法),以及Java中重要的内存分析(栈.堆.方法区.常量池) 以上就是Eclipse中的快捷键快速生成常用代码(例如无参.带参构造,set.get方法),以及Java中重要的内存分析(栈.堆.方法区.常量池)的全部内容了,更多内容请关注:CPP学习网_CPP大学 本文固定链接:CPP学习网_CPP大学-Eclipse中的快捷键快速生成常用代码(例如无参.带参构造,set.get方法),以及Java中重要的内存分析(栈.