MongoDB3.6与java结合的代码使用(重点是多条件查询)

首先声明:由于我所使用的mongoDB版本为3.6,只针对3.6版本的java代码书写做以下事例。至于mongoDB低版本的好多方法在高版本中已经做了很大的改变。所以我建议各位小伙伴也尽量使用该版本的。(到我现在写的这篇博客为止,mongoDB最新的版本是4.0)

下载地址: https://www.mongodb.com/download-center#community

以上所示是选择版本和运行平台的类型和包的类型。

对于已经熟悉了在windows下cmd命令行里操作mongoDB的朋友来说,我相信对于java的结合应该来说不是很困难。无非的就是多看看APl文档说明这些!

 

好了 以上说了这么多。那就直接进入我们今天的主题吧。

要想应用mongoDB和java的结合,第一步就是建了一个java项目.确切来说是一个简单的maven工程。如下:

 

这里只需要一个类做演示。(实现最基本的 增 删 改 查

pom.xml 文件配置则更是简单。只需要引入一个jar包即可。如下所示:

当然了,对于不同版本的jar在maven库里请自行下载。

下载地址:https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver

搭建后这个项目之后,就直接开始写代码测试了。首先请确保你的mongoDB安装并且服务是开启的。

测试代码如下:

先贴上导包的信息。因为有一个类(MongoClient)我在测试的时候导错了,废了好大劲。所以为了防止有的朋友搞错我先贴出导包的信息。

import org.bson.Document;

import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Projections;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientOptions.Builder;

下面的代码全是在 main方法里面执行!!!

下面是AppMongoDB.class代码

    final static String userName = "root";
	final static String password = "root123";
	final static String source = "ycong";
	
	public static void main(String[] args) {
		
	//以下是基于MongoDB 3.7版本 官方给的APi 说明创建连接
	/**
	 * 使用builder来设置连接池
	 */
	 Builder builder = new Builder();
	 //设置每个主机的最大连接数
	 builder.connectionsPerHost(30);
	 //设置最小的连接数
	 builder.minConnectionsPerHost(10);
	 //设置超时时间 2秒
	 builder.connectTimeout(2000);
	 //设置线程等待的最长时间
	 builder.maxWaitTime(4000);
	 /**
	  * 此参数跟connectionsPerHost的乘机为一个线程变为可用的最大阻塞数,
	  * 超过此乘机数之后的所有线程将及时获取一个异常.eg.connectionsPerHost=10 and
	  *  threadsAllowedToBlockForConnectionMultiplier=5,
	  * 最多50个线程等级一个链接,推荐配置为5
	  */
	 builder.threadsAllowedToBlockForConnectionMultiplier(5);
	 //最大空闲时间
	 builder.maxConnectionIdleTime(7000);
	 //设置连接池的最大生命周期时间
	 builder.maxConnectionLifeTime(7000);
	 //连接超时时间
	 builder.socketTimeout(8000);
	 
	 MongoClientOptions myOptions = builder.build();
	 
	//连接mongoDB的服务
	ServerAddress serverAdderss =  new ServerAddress("localhost",27017);
	
	List<ServerAddress> listAdd = new ArrayList<ServerAddress>();
	
	listAdd.add(serverAdderss);
	
	MongoCredential mongoCre =  MongoCredential.createCredential(userName, source, password.toCharArray());
	
	MongoClient mongoClient = new MongoClient(listAdd,mongoCre,myOptions);
	 
	MongoDatabase mongoDatabase =   mongoClient.getDatabase("ycong");//你的数据库名称,据说是没有这个,mongoDB会自己创建


}

 

上面的设置其实差不多你可以理解为是固定的吧。有的朋友设置有区别其实也是大同小异(由你自己设置)!这个不去过多的纠结。以上的代码其实执行到最后,就是获取的我们要操作的数据库实列。很显然我这个数据库的名字是"ycong". 那么我们接下来应该操作mogoDatabase这个对象了。

现在我们有了“ycong”这个数据库!接下来就给库“建表”添加数据

mongoDB数据库不同于传统的关系型数据库(如 mysql,oracle等)。至于他们之间的不同,请大家去网上自行了解,这里不说明。

mongoDB数据库里面建表其实是创建一个集合文档。 所谓的字段和数据的关系其实是 key-value的关系。这一点适合redis思想是相同的。

创建集合文档代码如下:

//创建一个集合文档
		mongoDatabase.createCollection("doc4");//doc4是文档名。这个你随便起。
//下面这一步 就是获取你创建的 这个文档集合 接下来就直接操作他
		MongoCollection<Document> collection2 = mongoDatabase.getCollection("doc4");
//现在我们的集合文档没有对象,所以你得创建 一个文档对象。
		Document document2 = new Document();
		document2.append("name", "唐伯虎");
		document2.append("age", 23);
		document2.append("cpm", "LOVE");
		String doc = "别人笑我太疯癫,我笑他人看不穿。不见武林豪杰墓,无花无酒锄作田!";
		document2.append("doc", doc);
collection2.insertOne(document2);//然后添加到你所创建的集合文档里面  相当于 sql中 insert语句 

上面得代码你很容易就看出文档得添加是append(key,value)的形式添加的。key相当于传统sql表中的字段,value是数据。

执行完上面的代码之后 我们的集合文档里面就有了文档。(里面就有了数据

然后我们就来查询一下这个文档对象!

代码如下:

        //find方法 返回FindIterable对象 所以用它接收
        FindIterable<Document> findAble2 =  collection2.find();
        //获取集合文档中的第一个文档对象
		Document document3 = findAble2.first();
		String string3 = document3.toString();
		System.out.println("新创建的对象并获得:"+string3);

//我的这个表里面只要一个文档对象。要是多的对象 我们可以使用迭代器进行输出
//		FindIterable<Document> find2 = collection2.find();
//		MongoCursor<Document> iterator = find2.iterator();
//		//迭代器查找对象   输出这个集合文档的所有对象
//		while (iterator.hasNext()) {
//			System.out.println(iterator.next());
//		}

可以看的,传统的sql是对进行操作,mongoDB的操作对象是集合文档。上面这个写法相当于“select * from table”,当然一般项目重,使用条件查询的很多(where  id = ? and name >? 类似于这种)。

下面我们就来重点看一下mongoDB3.6做了哪些新的查询优化:

比如我想查询 name="唐伯虎"的这个条件的所有信息,写法如下:

    FindIterable<Document> find2 =collection2.find(Filters.eq("name", "唐伯虎"));
		
		MongoCursor<Document> iterator = find2.iterator();
		//迭代器查找对象   输出这个集合文档的所有对象
		while (iterator.hasNext()) {
			
			System.out.println("输出结果:"+iterator.next());
			
		}

再比如我想查询一下name="唐伯虎"并且age=23 符合这两条件的信息,写法如下:

FindIterable<Document> find2 =collection2.find(Filters.and(Filters.eq("name", "唐伯虎"),Filters.eq("age",23)));
		
		MongoCursor<Document> iterator = find2.iterator();
		//迭代器查找对象   输出这个集合文档的所有对象
		while (iterator.hasNext()) {
			
			System.out.println("输出结果:"+iterator.next());
			
		}

至于判断更多的条件查询大家去看看API就清楚了。(比如 > ,<, no null 等这些条件。API写的已经很详细了。)

下面我再补充一点的就是关于过滤查询

什么是 过滤查询呢?

其实就是 传统的sql查询返回想要的字段数据! 

举个例子:比如你要查询一个学生的基本信息,但是这个学生的基本信息有30几个字段。你只想要他的名字年龄。

那么写sql的时候你只查询他的这连个字段就可以了,其他的不需要!

查询实列:请查询集合文档中age=23的对象的name和cpm这两个值?

在mongoDB中的写法如下:

FindIterable<Document> find2 =collection2.find(Filters.eq("age",23)).projection(Projections.include("name","cpm"));
		
		MongoCursor<Document> iterator = find2.iterator();
		//迭代器查找对象   输出这个集合文档的所有对象
		while (iterator.hasNext()) {
			
			System.out.println("输出结果:"+iterator.next());
			
		}

Projections.include()这个方法就是包含要返回的key的value

有一点要注意,假如你返回要这个人信息的name,age,doc...有数10个信息。怎么写呢?像这样拼接吗:

(Projections.include("name","age","3","4"....."10"))

这样写当然是可以的,但是代码显得有点乱,而且也不好维护! 当然还有更简单的方法!

查询要求:假如查询条件是age=23,返回他的name,cpm,age,doc这些信息。

代码如下:

List<String> listNames = new ArrayList<String>();
		listNames.add("name");
		listNames.add("age");
		listNames.add("cpm");
		listNames.add("doc");
		FindIterable<Document> find2 =collection2.find(Filters.eq("age",23)).projection(Projections.include(listNames));

可以看到封装成一个 list集合 在把这个list集合传进去就可以了。

当然还有相反的查询方法。就是Projections.exclude(“name”)这个方法。其实就是返回key=name的所有key的value.

 

以上就是mongoDB3.6的一些查询的用法,其实API里面的方法还有好多,好多。时间关系,只写几个而已。具体还需要你去自己研究。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值