什么是mongogb
MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫。由C++語言編寫。旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案萨咳。
MongoDB是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的决记。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json的bson格式倍踪,因此可以存儲比較復(fù)雜的數(shù)據(jù)類型系宫。Mongo最大的特點是他支持的查詢語言非常強(qiáng)大,其語法有點類似于面向?qū)ο蟮牟樵冋Z言建车,幾乎可以實現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能扩借,而且還支持對數(shù)據(jù)建立索引。
來源 【百度百科】
mongodb的特性與優(yōu)點
- 存儲方式:虛擬內(nèi)存+持久化缤至。
- 查詢語句:是獨特的Mongodb的查詢方式潮罪。
- 適合場景:事件的記錄,內(nèi)容管理或者博客平臺等等领斥。
- 架構(gòu)特點:可以通過副本集嫉到,以及分片來實現(xiàn)高可用。
- 數(shù)據(jù)處理:數(shù)據(jù)是存儲在硬盤上的月洛,只不過需要經(jīng)常讀取的數(shù)據(jù)會被加載到內(nèi)存中何恶,將數(shù)據(jù)存儲在物理內(nèi)存中,從而達(dá)到高速讀寫嚼黔。
- 成熟度與廣泛度:新興數(shù)據(jù)庫细层,成熟度較低惜辑,Nosql數(shù)據(jù)庫中最為接近關(guān)系型數(shù)據(jù)庫,比較完善的DB之一疫赎,適用人群不斷在增長盛撑。
優(yōu)點:
- 快速!在適量級的內(nèi)存的Mongodb的性能是非常迅速的捧搞,它將熱數(shù)據(jù)存儲在物理內(nèi)存中抵卫,使得熱數(shù)據(jù)的讀寫變得十分快。
- 高擴(kuò)展
- 自身的Failover機(jī)制
- json的存儲格式
mongodb的具體應(yīng)用場景
mongodb的主要目標(biāo)是在鍵/值存儲方式(提供了高性能和高度伸縮性)以及傳統(tǒng)的RDBMS系統(tǒng)(豐富的功能)架起一座橋梁胎撇,集兩者的優(yōu)勢于一身陌僵。mongo適用于以下場景:
- 1、網(wǎng)站數(shù)據(jù):mongo非常適合實時的插入创坞,更新與查詢碗短,并具備網(wǎng)站實時數(shù)據(jù)存儲所需的復(fù)制及高度伸縮性。
- 2题涨、緩存:由于性能很高偎谁,mongo也適合作為信息基礎(chǔ)設(shè)施的緩存層。在系統(tǒng)重啟之后纲堵,由mongo搭建的持久化緩存可以避免下層的數(shù)據(jù)源過載巡雨。
- 3、大尺寸席函、低價值的數(shù)據(jù):使用傳統(tǒng)的關(guān)系數(shù)據(jù)庫存儲一些數(shù)據(jù)時可能會比較貴铐望,在此之前,很多程序員往往會選擇傳統(tǒng)的文件進(jìn)行存儲茂附。
- 4正蛙、高伸縮性的場景:mongo非常適合由數(shù)十或者數(shù)百臺服務(wù)器組成的數(shù)據(jù)庫。
- 5营曼、用于對象及JSON數(shù)據(jù)的存儲:mongo的BSON數(shù)據(jù)格式非常適合文檔格式化的存儲及查詢乒验。
不適合的場景: - 1、高度事務(wù)性的系統(tǒng)蒂阱,比如銀行锻全、證券等強(qiáng)業(yè)務(wù)系統(tǒng)。
- 2录煤、傳統(tǒng)的商業(yè)智能應(yīng)用鳄厌,比如BI查詢分析,需要對多字段進(jìn)行組合查詢妈踊。
- 3了嚎、需要SQL的場景,比如需要做sum响委、groupby 等匯總統(tǒng)計系統(tǒng)新思。
上面那些來源于mongodb的官方說明,簡單來講赘风,就是需要快速夹囚、大量按唯一主鍵進(jìn)行查詢更新的,可以采用mongodb邀窃,需要多表關(guān)聯(lián)查詢荸哟、事務(wù)操作的,不適合mongodb
舉幾個例子:
1瞬捕、ofo或膜拜單車等車輛的位置信息鞍历,數(shù)量有限(相對),而且可以根據(jù)車牌號進(jìn)行快速查詢肪虎,并需要實時更新位置信息劣砍,即LBS應(yīng)用。
2扇救、社交場景刑枝,使用 MongoDB 存儲存儲用戶信息,以及用戶發(fā)表的朋友圈信息迅腔,通過地理位置索引實現(xiàn)附近的人装畅、地點等功能。
3沧烈、鐵路的車號追蹤系統(tǒng)掠兄,實時查詢每輛車的車種、車型锌雀、貨物蚂夕、當(dāng)前站、當(dāng)前位置等信息腋逆。
4双抽、實時監(jiān)控系統(tǒng),監(jiān)控服務(wù)器的訪問數(shù)據(jù)闲礼、監(jiān)控應(yīng)用系統(tǒng)的請求計數(shù)等
5牍汹、網(wǎng)游中的玩家裝備、積分柬泽、技能慎菲、經(jīng)驗等快速變換信息,方便查詢锨并、更新
6露该、物流場景,使用 MongoDB 存儲訂單信息第煮,訂單狀態(tài)在運送過程中會不斷更新解幼,以 MongoDB 內(nèi)嵌數(shù)組的形式來存儲抑党,一次查詢就能將訂單所有的變更讀取出來
7、物聯(lián)網(wǎng)場景撵摆,使用 MongoDB 存儲所有接入的智能設(shè)備信息底靠,以及設(shè)備匯報的日志信息,并對這些信息進(jìn)行多維度的分析
8特铝、視頻直播暑中,使用 MongoDB 存儲用戶信息、禮物信息等
mongodb下載與安裝
分linux鲫剿、windows鳄逾、mac等,根據(jù)需要選擇下載灵莲,生產(chǎn)還是建議linux雕凹,主從結(jié)構(gòu)。
linux下安裝:http://www.runoob.com/mongodb/mongodb-linux-install.html
windows下安裝:http://www.runoob.com/mongodb/mongodb-window-install.html
界面化管理工具
mongodb的管理工具很多政冻,這里介紹用的比較多的Robomongo
安裝完后打開:
建立連接请琳,端口默認(rèn)27017
mongodb在java中的使用
添加mongodb的依賴
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>bson</artifactId>
<version>3.4.2</version>
</dependency>
這里面用到了兩個,一個是mongodb的java驅(qū)動赠幕,一個mongodb的bson數(shù)據(jù)格式j(luò)ar包
MongoConnect連接數(shù)據(jù)庫
public class MongoConnect {
/**
* 建立mongodb連接
*
* @return
*/
public MongoClient getConnection() {
MongoClient mongoClient = null;
try {
//連接到MongoDB服務(wù) 如果是遠(yuǎn)程連接可以替換“l(fā)ocalhost”為服務(wù)器所在IP地址
//ServerAddress()兩個參數(shù)分別為 服務(wù)器地址 和 端口
ServerAddress serverAddress = new ServerAddress("localhost", 27017);
/* List<ServerAddress> addrs = new ArrayList<ServerAddress>();
addrs.add(serverAddress);//如果是集群俄精,需要用到地址列表*/
mongoClient = new MongoClient(serverAddress);
/*
//MongoCredential.createScramSha1Credential()三個參數(shù)分別為 用戶名 數(shù)據(jù)庫名稱 密碼
MongoCredential credential = MongoCredential.createScramSha1Credential("username", "databaseName", "password".toCharArray());
List<MongoCredential> credentials = new ArrayList<MongoCredential>();
credentials.add(credential);
//通過連接認(rèn)證獲取MongoDB連接
mongoClient = new MongoClient(addrs, credentials);
*/
} catch (Exception e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());
}
return mongoClient;
}
/**
* 關(guān)閉連接
*
* @param mongoClient
*/
public void closeConnection(MongoClient mongoClient) {
mongoClient.close();
}
public static void main(String[] args) {
MongoConnect mongoConnect = new MongoConnect();
MongoClient mongoClient = mongoConnect.getConnection();
System.out.println(mongoClient);
mongoConnect.closeConnection(mongoClient);
}
}
這里要說明以下幾點:
1、如果連接mongodb的集群榕堰,需要用到List<ServerAddress>
竖慧,mongoClient連接多個地址
2、連接時如果mongodb沒有賬號和密碼逆屡,則不需要設(shè)置MongoCredential
直接連接即可圾旨。當(dāng)然一定要確保mongodb處于內(nèi)網(wǎng),不被外網(wǎng)攻擊魏蔗。前一段時間出現(xiàn)的mongodb攻擊砍的,就是因為mongodb沒有密碼,同時27017端口開放了莺治,導(dǎo)致數(shù)據(jù)信息泄露廓鞠。
創(chuàng)建Collection和查詢,MongoConnect.java
public class CreateCollection {
public static void main(String[] args) {
MongoConnect mongoConnect = new MongoConnect();
MongoClient mongoClient = mongoConnect.getConnection();//建立mongb的客戶端連接
MongoDatabase mongoDatabase = mongoClient.getDatabase("test");//連接指定數(shù)據(jù)庫test,如果不存在會創(chuàng)建
System.out.println("連接數(shù)據(jù)庫成功");
//創(chuàng)建集合 參數(shù)為 “集合名稱”
mongoDatabase.createCollection("collectionTest");//創(chuàng)建集合
System.out.println("集合創(chuàng)建成功");
//獲取集合 參數(shù)為“集合名稱”
MongoCollection<Document> mongoCollection = mongoDatabase.getCollection("collectionTest");//如果不存在會創(chuàng)建
System.out.println("成功獲取集合");
}
}
說明以下幾點:
1谣旁、mongoClient.getDatabase("test");
mongoClient在獲取數(shù)據(jù)庫時床佳,如果該庫不存在,會新建一個
2榄审、mongodb中的database
和關(guān)系數(shù)據(jù)庫中的database
非常相像砌们,MongoCollection
和關(guān)系數(shù)據(jù)庫中的table
類似。
插入文檔,InsertDocument.java
public class InsertDocument {
public static void main(String[] args) {
MongoConnect mongoConnect = new MongoConnect();
MongoClient mongoClient = mongoConnect.getConnection();//建立mongb的客戶端連接
MongoCollection<Document> mongoCollection = mongoClient.getDatabase("test").getCollection("collectionTest");//如果不存在會創(chuàng)建
Document document = new Document("title", "MongoDB").
append("description", "database").
append("likes", 100).
append("by", "Fly");
List<Document> documents = new ArrayList<Document>();
documents.add(document);
mongoCollection.insertMany(documents);
System.out.println("文檔插入成功");
}
}
這里面的Document
就和關(guān)系數(shù)據(jù)庫中的row
類似浪感,先建立一個Document
昔头,并設(shè)置具體的字段,這里面的字段就是按照key
影兽,value
的形式創(chuàng)建的揭斧。然后獲取mongoCollection
,執(zhí)行insert
查詢數(shù)據(jù)赢笨。
執(zhí)行成功,用Robomongo查看如下:
這里面的id
字段是mongodb自動生成的字段
檢索文檔驮吱,SearchDocument.java
public class SearchDocument {
public static void main(String[] args) {
MongoConnect mongoConnect = new MongoConnect();
MongoClient mongoClient = mongoConnect.getConnection();//建立mongb的客戶端連接
MongoCollection<Document> mongoCollection = mongoClient.getDatabase("test").getCollection("collectionTest");//如果不存在會創(chuàng)建
//檢索所有文檔
/**
* 1. 獲取迭代器FindIterable<Document>
* 2. 獲取游標(biāo)MongoCursor<Document>
* 3. 通過游標(biāo)遍歷檢索出的文檔集合
* */
FindIterable<Document> findIterable = mongoCollection.find();
MongoCursor<Document> mongoCursor = findIterable.iterator();
while(mongoCursor.hasNext()){
System.out.println(mongoCursor.next());
}
}
}
原理就是茧妒,先確定mongoCollection
即要檢索哪個Collection
,然后建立FindIterable
迭代器左冬,建立mongoCursor
桐筏,就是JDBC中的ResultSet
,循環(huán)輸出。
當(dāng)然Mongodb的查詢還有很多很多拇砰,比如聚合查詢梅忌、條件查詢、or查詢等等除破,后面會更加詳細(xì)的介紹
更新Document牧氮,UpdateDocument.java
public class UpdateDocument {
public static void main(String[] args) {
MongoConnect mongoConnect = new MongoConnect();
MongoClient mongoClient = mongoConnect.getConnection();//建立mongb的客戶端連接
MongoCollection<Document> mongoCollection = mongoClient.getDatabase("test").getCollection("collectionTest");//如果不存在會創(chuàng)建
//更新文檔 將文檔中l(wèi)ikes=100的文檔修改為likes=200
mongoCollection.updateMany(Filters.eq("likes", 100), new Document("$set", new Document("likes", 200)));
//檢索查看結(jié)果
FindIterable<Document> findIterable = mongoCollection.find();
MongoCursor<Document> mongoCursor = findIterable.iterator();
while (mongoCursor.hasNext()) {
System.out.println(mongoCursor.next());
}
}
}
mongoCollection.updateMany(Filters.eq("likes", 100), new Document("$set", new Document("likes", 200)));
這句話,先查找對應(yīng)記錄瑰枫,然后更新對應(yīng)字段踱葛。
刪除Document,DeleteDocument.java
public class DeleteDocument {
public static void main(String[] args) {
MongoConnect mongoConnect = new MongoConnect();
MongoClient mongoClient = mongoConnect.getConnection();//建立mongb的客戶端連接
MongoCollection<Document> mongoCollection = mongoClient.getDatabase("test").getCollection("collectionTest");//如果不存在會創(chuàng)建
//刪除符合條件的第一個文檔
mongoCollection.deleteOne(Filters.eq("likes", 200));
//刪除所有符合條件的文檔
mongoCollection.deleteMany (Filters.eq("likes", 200));
//檢索查看結(jié)果
FindIterable<Document> findIterable = mongoCollection.find();
MongoCursor<Document> mongoCursor = findIterable.iterator();
while(mongoCursor.hasNext()){
System.out.println(mongoCursor.next());
}
}
}
mongoCollection.deleteMany (Filters.eq("likes", 200));
可以刪除一條或多條,按照指定條件操作光坝。
學(xué)習(xí)mongodb的時候尸诽,每個對象都參照關(guān)系數(shù)據(jù)庫的對應(yīng)對象,學(xué)習(xí)起來就會快很多了盯另。各個對象的關(guān)聯(lián)關(guān)系如下:
- MongoConnect->Connection
- MongoDatabase ->Database(MySql),User/Schema(Oracle)
- Collection->Table
- Document ->Row
- FindIterable->PrepareStatement
- FindIterable ->ResultSet