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臺伺服器完成寫操作。