是一個基于分布式檔案存儲的資料庫。由 C++ 語言編寫。旨在為 WEB 應用提供可擴充的高性能資料存儲解決方案。
MongoDB
是一個
MongoDB
介于關系資料庫和非關系資料庫之間
的産品,是非關系資料庫當中功能最豐富,最像關系資料庫的。
MongoDB 将資料存儲為一個文檔,資料結構由鍵值(key=>value)對組成。MongoDB 文檔(BSON)類似于 JSON 對象。字段值可以包含其他文檔,數組及文檔數組。
前言
NoSQL最普遍的解釋是“非關聯型的”,強調
Key-Value Stores
和
文檔資料庫
的優點,而不是單純的反對RDBMS。

關系型資料庫
關系型資料庫:指采用了`關系模型`來組織資料的資料庫。
關系模型指的就是二維表格模型,而一個關系型資料庫就是由二維表及其之間的聯系所組成的一個資料組織。
關系型資料庫的優點:
1. 容易了解:二維表結構是非常貼近邏輯世界的一個概念,關系模型相對網狀、層次等其他模型來說更容易了解
2. 使用友善:通用的SQL語言使得操作關系型資料庫非常友善
3. 易于維護:豐富的完整性(實體完整性、參照完整性和使用者定義的完整性)大大減低了資料備援和資料不一緻的機率
關系型資料庫存在的問題:
1. 網站的使用者并發性非常高,往往達到每秒上萬次讀寫請求,對于傳統關系型資料庫來說,硬碟I/O是一個很大的瓶頸
2. 網站每天産生的資料量是巨大的,對于關系型資料庫來說,在一張包含海量資料的表中查詢,效率是非常低的
3. 在基于web的結構當中,資料庫是最難進行橫向擴充的,當一個應用系統的使用者量和通路量與日俱增的時候,
資料庫卻沒有辦法像web server和app server那樣簡單的通過添加更多的硬體和服務節點來擴充性能和負載能力。
當需要對資料庫系統進行更新和擴充時,往往需要停機維護和資料遷移。
4. 性能欠佳:在關系型資料庫中,導緻性能欠佳的最主要原因是多表的關聯查詢,以及複雜的資料分析類型的複雜SQL報表查詢。
為了保證資料庫的ACID特性,必須盡量按照其要求的範式進行設計,關系型資料庫中的表都是存儲一個格式化的資料結構。
資料庫事務必須具備ACID特性:
ACID分别是`Atomic原子性`,`Consistency一緻性`,`Isolation隔離性`,`Durability持久性`。
非關系型資料庫
非關系型資料庫都是針對某些特定的應用需求出現的,是以,對于該類應用,具有極高的性能。
依據結構化方法以及應用場合的不同,主要分為以下幾類:
1. 面向`高性能并發讀寫`的`key-value資料庫`:
key-value資料庫的主要特點是具有極高的并發讀寫性能
Key-value資料庫是一種以鍵值對存儲資料的一種資料庫,類似Java中的map。
可以将整個資料庫了解為一個大的map,每個鍵都會對應一個唯一的值。
主流代表為Redis, Amazon DynamoDB, Memcached,Microsoft Azure Cosmos DB和Hazelcast
2. 面向`海量資料通路`的`面向文檔資料庫`:
這類資料庫的主要特點是`在海量的資料中可以快速的查詢資料`
文檔存儲通常使用内部表示法,可以直接在應用程式中處理,主要是`JSON`。
JSON文檔也可以作為純文字存儲在鍵值存儲或關系資料庫系統中。
主流代表為MongoDB,Amazon DynamoDB,Couchbase,Microsoft Azure Cosmos DB和CouchDB
3. 面向搜尋資料内容的`搜尋引擎`:
搜尋引擎是專門用于`搜尋資料内容`的NoSQL資料庫管理系統。
主要是用于`對海量資料進行近實時的處理和分析處理`,可用于`機器學習和資料挖掘`
主流代表為Elasticsearch,Splunk,Solr,MarkLogic和Sphinx
4. 面向可擴充性的`分布式`資料庫(列存儲資料庫):
這類資料庫的主要特點是具有很強的`可拓展性`
普通的關系型資料庫都是以行為機關來存儲資料的,擅長以行為機關的讀入處理,比如特定條件資料的擷取。
是以,關系型資料庫也被成為面向行的資料庫。
相反,面向列的資料庫是以列為機關來存儲資料的,擅長以列為機關讀入資料。
這類資料庫想解決的問題就是傳統資料庫存在可擴充性上的缺陷,
這類資料庫可以`适應資料量的增加以及資料結構的變化`,将資料存儲在記錄中,能夠容納大量動态列。
由于列名和記錄鍵不是固定的,并且由于記錄可能有數十億列,是以可擴充性存儲可以看作是二維鍵值存儲。
主流代表為Cassandra,HBase,Microsoft Azure Cosmos DB,Datastax Enterprise和Accumulo
關系型與非關系型資料庫的比較
1. 成本:Nosql資料庫簡單易部署,基本都是開源軟體,
不需要像使用Oracle那樣花費大量成本購買使用,相比關系型資料庫價格便宜。
2. 查詢速度:Nosql資料庫将資料存儲于緩存之中,而且不需要經過SQL層的解析,
關系型資料庫将資料存儲在硬碟中,自然查詢速度遠不及Nosql資料庫。
3. 存儲資料的格式:Nosql的存儲格式是key,value形式、文檔形式、圖檔形式等等,
是以可以存儲基礎類型以及對象或者是集合等各種格式,而資料庫則隻支援基礎類型。
4. 擴充性:關系型資料庫有類似join這樣的多表查詢機制的限制導緻擴充很艱難。
Nosql基于鍵值對,資料之間沒有耦合性,是以非常容易水準擴充。
5. 持久存儲:Nosql不使用于持久存儲,海量資料的持久存儲,還是需要關系型資料庫
6. 資料一緻性:非關系型資料庫一般強調的是資料最終一緻性,
不像關系型資料庫一樣強調資料的強一緻性,從非關系型資料庫中讀到的有可能還是處于一個中間态的資料,
Nosql不提供對事務的處理。
MongoDB 基礎概念
SQL術語/概念 | MongoDB術語/概念 | 解釋/說明 |
---|---|---|
database | 資料庫 | |
table | collection(一張表) | 資料庫表/集合 |
row | document(一組資料) | 資料記錄行/文檔 |
column | field | 資料字段/域 |
index | 索引 | |
table joins | 表連接配接,MongoDB不支援 | |
primary key | 主鍵,MongoDB自動将_id字段設定為主鍵 |
MongoDB 資料類型
資料類型 | 描述 |
---|---|
String | 字元串。存儲資料常用的資料類型。在 MongoDB 中,UTF-8 編碼的字元串才是合法的。 |
Integer | 整型數值。用于存儲數值。根據你所采用的伺服器,可分為 32 位或 64 位。 |
Boolean | 布爾值。用于存儲布爾值(真/假)。 |
Double | 雙精度浮點值。用于存儲浮點值。 |
Min/Max keys | 将一個值與 BSON(二進制的 JSON)元素的最低值和最高值相對比。 |
Array | 用于将數組或清單或多個值存儲為一個鍵。 |
Timestamp | 時間戳。記錄文檔修改或添加的具體時間。 |
Object | 用于内嵌文檔。 |
Null | 用于建立空值。 |
Symbol | 符号。該資料類型基本上等同于字元串類型,但不同的是,它一般用于采用特殊符号類型的語言。 |
Date | 日期時間。用 UNIX 時間格式來存儲目前日期或時間。你可以指定自己的日期時間:建立 Date 對象,傳入年月日資訊。 |
Object ID | 對象 ID。用于建立文檔的 ID。 |
Binary Data | 二進制資料。用于存儲二進制資料。 |
Code | 代碼類型。用于在文檔中存儲 JavaScript 代碼。 |
Regular expression | 正規表達式類型。用于存儲正規表達式。 |
基本文法
use 資料庫名稱 //如果資料庫不存在則自動建立
db.集合名稱.insert(資料); //插入資料
db.集合名稱.find(); //查詢全部
db.集合名稱.find({name:'aaa'}); //按條件查詢
db.集合名稱.findOne({name:'aaa'}) //傳回指定條件的第一條資料
db.集合名稱.find().limit(3) //傳回指定條數資料
db.集合名稱.update({_id:"1"},{$set:{age:NumberInt(2000)}}) //更新資料
db.集合名稱.remove({name:'小明'}) //删除資料
db.集合名稱.count({name:"aaa"}) //統計條數
db.集合名稱.find({content:/^加班/}) //模糊查詢(以'加班'開頭的content)
db.集合名稱.find({ "field" : { $gt: value }}) // 大于: field > value
db.集合名稱.find({ "field" : { $lt: value }}) // 小于: field < value
db.集合名稱.find({ "field" : { $gte: value }}) // 大于等于: field >= value
db.集合名稱.find({ "field" : { $lte: value }}) // 小于等于: field <= value
db.集合名稱.find({ "field" : { $ne: value }}) // 不等于: field != value
db.集合名稱.find({userid:{$in:["aaa","bbb"]}}) //包含
db.集合名稱.find({userid:{$nin:["aaa","bbb"]}}) //不包含
db.集合名稱.find({$and:[ {visits:{$gte:1000}} ,{visits:{$lt:2000} }]}) //條件連接配接
$or:[ { },{ },{ } ]
db.集合名稱.update({_id:"1"},{$inc:{visits:NumberInt(1)}}) //列值增長
Java使用MongoDb
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb‐driver</artifactId>
<version>3.6.3</version>
</dependency>
public class MongoDemo {
public static void main(String[] args) {
MongoClient client=new MongoClient("192.168.184.134"); //建立連接配接
MongoDatabase spitdb = client.getDatabase("spitdb"); //打開資料庫
MongoCollection<Document> spit = spitdb.getCollection("spit"); //擷取集合
//插入資料
Map<String,Object> map=new HashMap();
map.put("content","我要吐槽");
map.put("userid","aaa");
map.put("visits",123);
map.put("publishtime",new Date());
Document document=new Document(map);
spit.insertOne(document); //插入資料
//查詢資料
BasicDBObject bson=new BasicDBObject("userid","aaa");
BasicDBObject bson=new BasicDBObject("visits",newBasicDBObject("$gt",1000) ); //建構查詢條件
FindIterable<Document> documents = spit.find(bson); //查詢記錄擷取文檔集合
for(Document document:documents){
System.out.println("内容:"+ document.getString("content"));
System.out.println("使用者ID:"+document.getString("userid"));
System.out.println("浏覽量:"+document.getInteger("visits"));
}
client.close(); //關閉連接配接
}
}