MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热门的一种。它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的产品。它支持的数据结构非常松散,是类似JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。
java连接及使用:
导入依赖:
<dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.4.1</version>
</dependency>
</dependencies>
遍历集合数据:
//创建连接对象
MongoClient client=new MongoClient();
//获取数据库
MongoDatabase database = client.getDatabase("test");
//获取集合
MongoCollection<Document> collection = database.getCollection("student");
//获取文档集合
FindIterable<Document> list = collection.find();
//遍历集合中的文档输出数据
for( Document doc: list){
System.out.println("name:"+ doc.getString("name") );
System.out.println("age:"+ doc.getDouble("age") );
System.out.println("--------------------------");
}
匹配查询:
//查询student集合中name为张三的文档
//构建查询条件
BasicDBObject bson=new BasicDBObject("name", "张三");
FindIterable<Document> list = collection.find(bson);//获取文档集合
//....遍历集合
模糊查询:
//构建模糊查询条件是通过正则表达式的方式来实现的
//完全匹配Pattern pattern = Pattern.compile("^name$");
//右匹配Pattern pattern = Pattern.compile("^.*name$");
//左匹配Pattern pattern = Pattern.compile("^name.*$");
//模糊匹配Pattern pattern = Pattern.compile("^.*name.*$");
//模糊查询student集合中name 中含有的"小"文档记录
//模糊查询:like %小%
Pattern queryPattern = Pattern.compile("^.*小.*$");
BasicDBObject bson=new BasicDBObject("name", queryPattern);
FindIterable<Document> list = collection.find(bson);//获取文档集合
//....遍历集合
大鱼小鱼:
//查询年龄小于20的
BasicDBObject bson=new BasicDBObject("age", new BasicDBObject("$lt",20));
FindIterable<Document> list = collection.find(bson);//获取文档集
//....遍历集合
and:
/查询年龄大于等于20的
BasicDBObject bson1=new BasicDBObject("age", new BasicDBObject("$gte",20));
//查询年龄小于30的
BasicDBObject bson2=new BasicDBObject("age", new BasicDBObject("$lt",30));
//构建查询条件and
BasicDBObject bson=new BasicDBObject("$and", Arrays.asList(bson1,bson2) );
or:
BasicDBObject bson1=new BasicDBObject("age", new BasicDBObject("$lte",20));
BasicDBObject bson2=new BasicDBObject("name", "张三");
//构建查询条件or
BasicDBObject bson=new BasicDBObject("$or", Arrays.asList( bson1, bson2 ) );
连接池:
MongoClient 被设计为线程安全的类,也就是我们在使用该类时不需要考虑并发的情况,这样我们可以考虑把MongoClient 做成一个静态变量,为所有线程公用,不必每次都销毁。这样可以极大提高执行效率。实际上,这是MongoDB提供的内置的连接池来实现的。
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientOptions.Builder;
import com.mongodb.WriteConcern;
import com.mongodb.client.MongoDatabase;
public class MongoManager {
private static MongoClient mongoClient=null;
//对mongoClient初始化
private static void init(){
//连接池选项
Builder builder = new MongoClientOptions.Builder();//选项构建者
builder.connectTimeout(5000);//设置连接超时时间
builder.socketTimeout(5000);//读取数据的超时时间
builder.connectionsPerHost(30);//每个地址最大请求数
builder.writeConcern(WriteConcern.NORMAL);//写入策略,仅抛出网络异常
MongoClientOptions options = builder.build();
mongoClient=new MongoClient("127.0.0.1",options);
}
public static MongoDatabase getDatabase(){
if(mongoClient==null){
init();
}
return mongoClient.getDatabase("itcastdb");
}
}
查询与测试:
import java.util.HashMap;
import java.util.Map;
import org.bson.Document;
import com.mongodb.BasicDBObject;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
public class SiteLogUtil {
/*
* 插入数据库
*/
public static void save(String logname,Map<String, Object> map) {
MongoDatabase database = MongoManger.getDatabase();
MongoCollection<Document> collection = database.getCollection(logname);
Document document = new Document(map);
collection.insertOne(document);
}
/*
* 按条件查询
*/
public static FindIterable<Document> list(String logName,Map<String, Object> map) {
MongoDatabase database = MongoManger.getDatabase();
MongoCollection<Document> collection = database.getCollection(logName);
BasicDBObject basicDBObject = new BasicDBObject(map);
return collection.find(basicDBObject);
}
/*
* 分页查询
*/
public static Map<String, Object> listPage(
String logName,Map<String, Object> map,int pageIndex,int pageSize) {
MongoDatabase database = MongoManger.getDatabase();
MongoCollection<Document> collection = database.getCollection(logName);
BasicDBObject filter = new BasicDBObject(map);
FindIterable<Document> find = collection.find(filter);
int skip = (pageIndex-1)*pageSize;
find.skip(skip);
find.limit(pageSize);
long count = collection.count();
Map<String, Object> mm = new HashMap<String, Object>();
mm.put("total", count);
mm.put("rows", find);
return mm;
}
}
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.bson.Document;
import org.junit.Test;
import com.hebi.SiteLogUtil;
import com.mongodb.client.FindIterable;
import com.mongodb.util.JSON;
public class mongoTestt {
@Test
public void test() {
for (int i = 0; i < 1000; i++) {
Map map = new HashMap();
map.put("userid", "1"+i);
map.put("Time", new Date());
map.put("goodsid", "123123");
SiteLogUtil.save("goods", map);
}
}
@Test
public void test2() {
Map map = new HashMap();
map.put("userid", "1");
FindIterable<Document> list = SiteLogUtil.list("browselog",map);
String serialize = JSON.serialize(list);
System.out.println(serialize);
}
@Test
public void test3() {
Map map = new HashMap();
map.put("goodsid", "123123");
Map<String, Object> list = SiteLogUtil.listPage("browselog", map, 2, 10);
String serialize = JSON.serialize(list);
System.out.println(serialize);
}