1. 程式人生 > >MongoDB簡單使用(java)

MongoDB簡單使用(java)

MongoDB

MongoDB 是一個跨平臺的,面向文件的資料庫,是當前 NoSQL 資料庫產品中最熱門的一種。它介於關係資料庫和非關係資料庫之間,是非關係資料庫當中功能最豐富,最像關係資料庫的產品。它支援的資料結構非常鬆散,是類似JSON 的 BSON 格式,因此可以儲存比較複雜的資料型別。

MongoDB 最大的特點是他支援的查詢語言非常強大,其語法有點類似於面向物件的查詢語言,幾乎可以實現類似關係資料庫單表查詢的絕大部分功能,而且還支援對資料建立索引。它是一個面向集合的,模式自由的文件型資料庫。

具體特點總結如下:

(1)面向集合儲存,易於儲存物件型別的資料

(2)模式自由

(3)支援動態查詢

(4)支援完全索引,包含內部物件

(5)支援複製和故障恢復

(6)使用高效的二進位制資料儲存,包括大型物件(如視訊等)

(7)自動處理碎片,以支援雲端計算層次的擴充套件性

(8)支援 Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及 C++語言的驅動程式,社群中也提供了對 Erlang 及.NET 等平臺的驅動程式

(9) 檔案儲存格式為 BSON(一種 JSON 的擴充套件)

MongoDB體系結構

MongoDB 的邏輯結構是一種層次結構。主要由:

文件(document)、集合(collection)、資料庫(database)這三部分組成的。邏輯結構是面向使用者

的,使用者使用 MongoDB 開發應用程式使用的就是邏輯結構。

(1)MongoDB 的文件(document),相當於關係資料庫中的一行記錄。

(2)多個文件組成一個集合(collection),相當於關係資料庫的表。

(3)多個集合(collection),邏輯上組織在一起,就是資料庫(database)。

(4)一個 MongoDB 例項支援多個數據庫(database)。

MongoDb 關係型資料庫Mysql
資料庫(databases) 資料庫(databases)
集合(collections) 表(table)
文件(document) 行(row)

使用use 資料庫名稱即可選擇資料庫,如果該資料庫不存在會自動建立

db.集合名稱.save(變數); 集合名稱(表) 如果該表不存在會自動建立

基本增刪改查語句

# 切換資料庫
use mydb
# 定義一個文件變數(就是一條記錄)
obj={name:"孫悟空",sex:"男",age:20,address:"花果山"};
# 插入一條文件(一條資料)
db.student.save(obj);
db.student.save({name:"沙和尚",sex:"男",age:25,address:"流沙河路11號"});
db.student.save({name:"唐僧",sex:"男",age:35,address:"東土大唐"});
db.student.save({name:"白骨精",sex:"女",age:18,address:"白骨洞"});
db.student.save({name:"白龍馬",sex:"男",age:20,address:"西海"});
db.student.save({name:"哪吒",sex:"男",age:15,address:"蓮花灣小區"});
# 查詢集合 在插入文件記錄時沒有指定_id欄位,MongDB會自動建立,其型別是ObjectID型別。
db.student.find();
# 條件查詢 性別為女
db.student.find({sex:"女"});
# 查詢 返回結果集的第一條記錄
db.student.findOne({sex:"男"});
# 查詢 返回前N條資料 
db.student.find().limit(3);
# 修改 修改後發現孫悟空的文件只剩_id和age
db.student.update({name:"孫悟空"},{age:500});
# 修改 並保留其他欄位
db.student.update({name:"孫悟空"},{$set:{age:500}});
# 刪除 條件刪除 ({}) 為刪除所有
db.student.remove({name:"哪吒"});

高階查詢

# 模糊查詢 通過正則表示式實現 /模糊查詢字串/
db.student.find({address:/洞/});  #address中含有洞的所有文件
db.student.find({address:/^西/}); #address中以西開頭的所有文件
# NULL
db.student.find({address:null});  #查詢address為null以及不存在該欄位的所有文件
# 大於小於 greater than   less than  greater than equals 
db.collection.find({ "field" : { $gt: value } } );  # 大於: field > value
db.collection.find({ "field" : { $lt: value } } );  # 小於: field < value
db.collection.find({ "field" : { $gte: value } } ); # 大於等於: field >= value
db.collection.find({ "field" : { $lte: value } } ); # 小於等於: field <= value
db.student.find({age:{$gt:20}});
# 不等於
db.student.find({sex:{$ne:"男"}}); # not euqals
# 判斷文件是否存在/不存在某個欄位
db.student.find({address:{$exists:true}});
db.student.find({address:{$exists:false}});
# in 包含/不包含 
db.student.find({age:{$in:[15,20,25]}});
db.student.find({age:{$nin:[88,99]}});
# 統計文件條數 
db.student.count();
db.student.count({sex:"男"}); #條件
# 條件連線
db.student.find({$and:[{sex:"男"},{age:{$gt:20}}]});
db.student.find({$or:[{sex:"男"},{age:{$gt:20}}]});

java連線MongoDB

  <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("mydb");//獲取資料庫		
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("sex:"+ doc.getString("sex") );
	System.out.println("age:"+ doc.getDouble("age") );//預設為浮點型
	System.out.println("address:"+ doc.getString("address") );
	System.out.println("--------------------------");
}

MongoDB的數字型別預設使用64位浮點型數值。{“x”:3.14}或{“x”:3}。

整型值,可以使用NumberInt(4位元組符號整數),{“x”:NumberInt(“3”)} 或NumberLong(8位元組符號整數){“x”:NumberLong(“3”)}

匹配查詢

//匹配查詢 MongoDB使用BasicDBObject型別封裝查詢條件,構造方法的引數為key 和value .
BasicDBObject bson=new BasicDBObject("name", "豬八戒");
FindIterable<Document> list = collection.find(bson);//獲取文件集合

long count = collection.count(bson);

模糊查詢

(1)完全匹配Pattern pattern = Pattern.compile("^name$");

(2)右匹配Pattern pattern = Pattern.compile("^.* name$");

(3)左匹配Pattern pattern = Pattern.compile("^name.* $");

(4)模糊匹配Pattern pattern = Pattern.compile("^.* name.* $");

//模糊查詢:like %洞%
Pattern queryPattern = Pattern.compile("^.*洞.*$");
BasicDBObject bson=new BasicDBObject("address", queryPattern);	
FindIterable<Document> list = collection.find(bson);//獲取文件集合

大於小於

在MongoDB提示符下條件json字串為{ age: { $lt :20 } } ,對應的java程式碼也是BasicDBObject 的巢狀

BasicDBObject bson=new BasicDBObject("age", new BasicDBObject("$lt",20));
FindIterable<Document> list = collection.find(bson);//獲取文件集

條件連線

//查詢年齡大於等於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)  );
BasicDBObject bson=new  BasicDBObject("$or", Arrays.asList( bson1, bson2 )  );

新增

Map<String, Object> map=new HashMap();
map.put("name", "鐵扇公主");
map.put("sex", "女");
map.put("age", 35.0);
map.put("address", "芭蕉洞");		
Document doc=new Document(map);		
collection.insertOne(doc);//插入一條記錄
//collection.insertMany(documents);//一次性插入多條文件

刪除

BasicDBObject bson=new BasicDBObject("name", "鐵扇公主");
collection.deleteOne(bson);//刪除記錄(符合條件的第一條記錄)
//collection.deleteMany(bson);//刪除符合條件的全部記錄

修改

//修改的條件
BasicDBObject bson= new BasicDBObject("name", "紅孩兒");
//修改後的值
BasicDBObject bson2 = new BasicDBObject("$set",new BasicDBObject("address", "南海"));
//引數1:修改條件  引數2:修改後的值
collection.updateOne(bson, bson2);//修改符合條件的第一條記錄
//collection.updateMany(filter, update);//修改符合條件的所有記錄

MongoDB連線池

MongoClient 被設計為執行緒安全的類,也就是我們在使用該類時不需要考慮併發的情況,這樣我們可以考慮把MongoClient 做成一個靜態變數,為所有執行緒公用,不必每次都銷燬。這樣可以極大提高執行效率。實際上,這是MongoDB提供的內建的連線池來實現的。

工具類

package com.hrh.demo;
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("mydb");
	}
}

寫入策略。

WriteConcern.NONE:沒有異常丟擲

WriteConcern.NORMAL:僅丟擲網路錯誤異常,沒有伺服器錯誤異常

WriteConcern.SAFE:丟擲網路錯誤異常、伺服器錯誤異常;並等待伺服器完成寫操作。

WriteConcern.MAJORITY: 丟擲網路錯誤異常、伺服器錯誤異常;並等待一個主伺服器完成寫操作。

WriteConcern.FSYNC_SAFE: 丟擲網路錯誤異常、伺服器錯誤異常;寫操作等待伺服器將資料重新整理到磁碟。

WriteConcern.JOURNAL_SAFE:丟擲網路錯誤異常、伺服器錯誤異常;寫操作等待伺服器提交到磁碟的日誌檔案。

WriteConcern.REPLICAS_SAFE:丟擲網路錯誤異常、伺服器錯誤異常;等待至少2臺伺服器完成寫操作。