文檔型數據庫MongoDB是怎樣的,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
MongoDB 是一個跨平臺的,面向文檔的數據庫,是當前 NoSQL 數據庫產品中最熱門的一種。它介于關系數據庫和非關系數據庫之間,是非關系數據庫當中功能最豐富,最像關系數據庫的產品。它支持的數據結構非常松散,是類似 JSON 的 BSON 格式,因此可以存儲比較復雜的數據類型。 MongoDB 的官方網站地址是:http://www.mongodb.org/
MongoDB 最大的特點是他支持的查詢語言非常強大,其語法有點類似于面向對象 的查 詢語言,幾乎可以實現類似關系數據庫單表查詢的絕大部分功能,而且還支持對數據建 立索 引。它是一個面向集合的,模式自由的文檔型數據庫。 具體特點總結如下:
(1)面向集合存儲,易于存儲對象類型的數據
(2)模式自由
(3)支持動態查詢
(4)支持完全索引,包含內部對象
(5)支持復制和故障恢復
(6)使用高效的二進制數據存儲,包括大型對象(如視頻等)
(7)自動處理碎片,以支持云計算層次的擴展性
(8)支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及 C++語言的驅動程序,社區中也提供了對 Erlang 及.NET 等平臺的驅動程序
(9) 文件存儲格式為 BSON(一種 JSON 的擴展)
MongoDB 的邏輯結構是一種層次結構。主要由: 文檔(document)、集合(collection)、數據庫(database)這三部分組成的。邏輯結構是面向用戶的,用戶使用 MongoDB 開發應用程序使用的就是邏輯結構。
(1)MongoDB 的文檔(document),相當于關系數據庫中的一行記錄。
(2)多個文檔組成一個集合(collection),相當于關系數據庫的表。
(3)多個集合(collection),邏輯上組織在一起,就是數據庫(database)。
(4)一個 MongoDB 實例支持多個數據庫(database)。 文檔(document)、集合(collection)、數據庫(database)的層次結構如下圖: 
下表是MongoDB與MySQL數據庫邏輯結構概念的對比 
基本數據類型
null:用于表示空值或者不存在的字段,{“x”:null}
布爾型:布爾類型有兩個值true和false,{“x”:true}
數值:shell默認使用64為浮點型數值。{“x”:3.14}或{“x”:3}。對于整型值,可以使用 NumberInt(4字節符號整數)或NumberLong(8字節符號整數), {“x”:NumberInt(“3”)}{“x”:NumberLong(“3”)}
字符串:UTF-8字符串都可以表示為字符串類型的數據,{“x”:“呵呵”}
日期:日期被存儲為自新紀元依賴經過的毫秒數,不存儲時區,{“x”:new Date()}
正則表達式:查詢時,使用正則表達式作為限定條件,語法與JavaScript的正則表達式相 同,{“x”:/[abc]/}
數組:數據列表或數據集可以表示為數組,{“x”: [“a“,“b”,”c”]}
內嵌文檔:文檔可以嵌套其他文檔,被嵌套的文檔作為值來處理,{“x”:{“y”:3 }}
對象Id:對象id是一個12字節的字符串,是文檔的唯一標識,{“x”: objectId() }
二進制數據:二進制數據是一個任意字節的字符串。它不能直接在shell中使用。如果要 將非utf-字符保存到數據庫中,二進制數據是唯一的方式。 代碼:查詢和文檔中可以包括任何JavaScript代碼,{“x”:function(){/…/}}
安裝 雙擊“資源\微服務相關\配套軟件\mongodb”中的“mongodb-win32-x86_64-2008plusssl- 3.2.10-signed.msi” 按照提示步驟安裝即可。安裝完成后,軟件會安裝在C:\Program Files\MongoDB 目錄中。
我們要啟動的服務程序就是C:\Program Files\MongoDB\Server\3.2\bin目錄下的 mongod.exe,為了方便我們每次啟動,我將C:\Program Files\MongoDB\Server\3.2\bin 設置到環境變量path中。
啟動
(1)首先打開命令提示符,創建一個用于存放數據的目錄
md d:\data
(2)啟動服務
mongod ‐‐dbpath=d:\data
我們在啟動信息中可以看到,mongoDB的默認端口是27017 如果我們想改變默認的啟動端口,可以通過--port來指定端口 在命令提示符輸入以下命令即可完成登陸
mongo
退出mongodb
exit
選擇和創建數據庫的語法格式:
use 數據庫名稱
如果數據庫不存在則自動創建 以下語句創建spit數據庫
use spitdb
插入文檔的語法格式:
db.集合名稱.insert(數據);
我們這里可以插入以下測試數據:
db.spit.insert({content:"聽說十次方課程很給力呀",userid:"1011",nickname:"小雅",visits:NumberInt(902)})查詢集合的語法格式:
db.集合名稱.find()
如果我們要查詢spit集合的所有文檔,我們輸入以下命令
db.spit.find()
這里你會發現每條文檔會有一個叫_id的字段,這個相當于我們原來關系數據庫中表的主 鍵,當你在插入文檔記錄時沒有指定該字段,MongoDB會自動創建,其類型是ObjectID 類型。如果我們在插入文檔記錄時指定該字段也可以,其類型可以是ObjectID類型,也 可以是MongoDB支持的任意類型。
輸入以下測試語句:
db.spit.insert({_id:"1",content:"我還是沒有想明白到底為啥出錯",userid:"1012",nickname:"小明",visits:NumberInt(2020)});
db.spit.insert({_id:"2",content:"加班到半夜",userid:"1013",nickname:"凱撒",visits:NumberInt(1023)});
db.spit.insert({_id:"3",content:"手機流量超了咋辦?",userid:"1013",nickname:"凱撒",visits:NumberInt(111)});
db.spit.insert({_id:"4",content:"堅持就是勝利",userid:"1014",nickname:"諾諾",visits:NumberInt(1223)});如果我想按一定條件來查詢,比如我想查詢userid為1013的記錄,怎么辦?很簡單!只 要在find()中添加參數即可,參數也是json格式,如下:
db.spit.find({userid:'1013'})如果你只需要返回符合條件的第一條數據,我們可以使用findOne命令來實現
db.spit.findOne({userid:'1013'})如果你想返回指定條數的記錄,可以在find方法后調用limit來返回結果,例如:
db.spit.find().limit(3)
修改文檔的語法結構:
db.集合名稱.update(條件,修改后的數據)
如果我們想修改_id為1的記錄,瀏覽量為1000,輸入以下語句:
db.spit.update({_id:"1"},{visits:NumberInt(1000)})執行后,我們會發現,這條文檔除了visits字段其它字段都不見了,為了解決這個問題, 我們需要使用修改器$set來實現,命令如下:
db.spit.update({_id:"2"},{$set:{visits:NumberInt(2000)}})這樣就OK啦。
刪除文檔的語法結構:
db.集合名稱.remove(條件)
以下語句可以將數據全部刪除,請慎用
db.spit.remove({})如果刪除visits=1000的記錄,輸入以下語句
db.spit.remove({visits:1000})統計記錄條件使用count()方法。以下語句統計spit集合的記錄數
db.spit.count()
如果按條件統計 ,例如:統計userid為1013的記錄條數
db.spit.count({userid:"1013"})MongoDB的模糊查詢是通過正則表達式的方式實現的。格式為:
/模糊查詢字符串/
例如,我要查詢吐槽內容包含“流量”的所有文檔,代碼如下:
db.spit.find({content:/流量/})如果要查詢吐槽內容中以“加班”開頭的,代碼如下:
db.spit.find({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示例:查詢吐槽瀏覽量大于1000的記錄
db.spit.find({visits:{$gt:1000}})包含使用$in操作符。
示例:查詢吐槽集合中userid字段包含1013和1014的文檔
db.spit.find({userid:{$in:["1013","1014"]}})不包含使用$nin操作符。
示例:查詢吐槽集合中userid字段不包含1013和1014的文檔
db.spit.find({userid:{$nin:["1013","1014"]}})我們如果需要查詢同時滿足兩個以上條件,需要使用$and操作符將條件進行關聯。(相當于SQL的and)
格式為:
$and:[ { },{ },{ } ]示例:查詢吐槽集合中visits大于等于1000 并且小于2000的文檔
db.spit.find({$and:[ {visits:{$gte:1000}} ,{visits:{$lt:2000} }]})如果兩個以上條件之間是或者的關系,我們使用or操作符進行關聯,與前面and的使用方式相同格式為:
$or:[ { },{ },{ } ]示例:查詢吐槽集合中userid為1013,或者瀏覽量小于2000的文檔記錄
db.spit.find({$or:[ {userid:"1013"} ,{visits:{$lt:2000} }]})如果我們想實現對某列值在原有值的基礎上進行增加或減少,可以使用$inc運算符來實現
db.spit.update({_id:"2"},{$inc:{visits:NumberInt(1)}} )mongodb-driver是mongo官方推出的java連接mongoDB的驅動包,相當于JDBC驅動。我們通過一個入門的案例來了解mongodb-driver的基本使用
(1)創建工程 mongoDemo, 引入依賴
<dependencies> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb‐driver</artifactId> <version>3.6.3</version> </dependency> </dependencies>
(2)創建測試類
/**
* MongoDb入門小demo
*/
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");//
獲取集合
FindIterable<Document> documents = spit.find();//查詢記錄獲取文檔集
合
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();//關閉連接
}
}BasicDBObject對象:表示一個具體的記錄,BasicDBObject實現了DBObject,是keyvalue 的數據結構,用起來和HashMap是基本一致的。
(1)查詢userid為1013的記錄
public class MongoDemo1 {
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");//
獲取集合
BasicDBObject bson=new BasicDBObject("userid","1013");// 構建查詢
條件
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();//關閉連接
}
}(2)查詢瀏覽量大于1000的記錄
public class MongoDemo2 {
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");//
獲取集合
BasicDBObject bson=new BasicDBObject("visits",new
BasicDBObject("$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();//關閉連接
}
}public class MongoDemo3 {
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","9999");
map.put("visits",123);
map.put("publishtime",new Date());
Document document=new Document(map);
spit.insertOne(document);//插入數據
client.close();
}
}看完上述內容,你們掌握文檔型數據庫MongoDB是怎樣的的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。