文檔型數(shù)據(jù)庫MongoDB是怎樣的

文檔型數(shù)據(jù)庫MongoDB是怎樣的,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

創(chuàng)新互聯(lián)是少有的成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、營銷型企業(yè)網(wǎng)站、小程序開發(fā)、手機(jī)APP,開發(fā)、制作、設(shè)計(jì)、賣鏈接、推廣優(yōu)化一站式服務(wù)網(wǎng)絡(luò)公司,成立于2013年,堅(jiān)持透明化,價(jià)格低,無套路經(jīng)營理念。讓網(wǎng)頁驚喜每一位訪客多年來深受用戶好評

1、 MongoDB簡介

1.1什么是MongoDB

MongoDB 是一個(gè)跨平臺(tái)的,面向文檔的數(shù)據(jù)庫,是當(dāng)前 NOSQL 數(shù)據(jù)庫產(chǎn)品中最熱門的一種。它介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的產(chǎn)品。它支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似 JSON 的 BSON 格式,因此可以存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類型。 MongoDB 的官方網(wǎng)站地址是:http://www.mongodb.org/

1.2 MongoDB特點(diǎn)

MongoDB 最大的特點(diǎn)是他支持的查詢語言非常強(qiáng)大,其語法有點(diǎn)類似于面向?qū)ο?的查 詢語言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建 立索 引。它是一個(gè)面向集合的,模式自由的文檔型數(shù)據(jù)庫。 具體特點(diǎn)總結(jié)如下:

(1)面向集合存儲(chǔ),易于存儲(chǔ)對象類型的數(shù)據(jù)

(2)模式自由

(3)支持動(dòng)態(tài)查詢

(4)支持完全索引,包含內(nèi)部對象

(5)支持復(fù)制和故障恢復(fù)

(6)使用高效的二進(jìn)制數(shù)據(jù)存儲(chǔ),包括大型對象(如視頻等)

(7)自動(dòng)處理碎片,以支持云計(jì)算層次的擴(kuò)展性

(8)支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及 C++語言的驅(qū)動(dòng)程序,社區(qū)中也提供了對 Erlang 及.NET 等平臺(tái)的驅(qū)動(dòng)程序

(9) 文件存儲(chǔ)格式為 BSON(一種 JSON 的擴(kuò)展)

1.3 MongoDB體系結(jié)構(gòu)

MongoDB 的邏輯結(jié)構(gòu)是一種層次結(jié)構(gòu)。主要由: 文檔(document)、集合(collection)、數(shù)據(jù)庫(database)這三部分組成的。邏輯結(jié)構(gòu)是面向用戶的,用戶使用 MongoDB 開發(fā)應(yīng)用程序使用的就是邏輯結(jié)構(gòu)。

(1)MongoDB 的文檔(document),相當(dāng)于關(guān)系數(shù)據(jù)庫中的一行記錄。

(2)多個(gè)文檔組成一個(gè)集合(collection),相當(dāng)于關(guān)系數(shù)據(jù)庫的表。

(3)多個(gè)集合(collection),邏輯上組織在一起,就是數(shù)據(jù)庫(database)。

(4)一個(gè) MongoDB 實(shí)例支持多個(gè)數(shù)據(jù)庫(database)。 文檔(document)、集合(collection)、數(shù)據(jù)庫(database)的層次結(jié)構(gòu)如下圖: 文檔型數(shù)據(jù)庫MongoDB是怎樣的

下表是MongoDB與MySQL數(shù)據(jù)庫邏輯結(jié)構(gòu)概念的對比 文檔型數(shù)據(jù)庫MongoDB是怎樣的

1.4 數(shù)據(jù)類型

基本數(shù)據(jù)類型

null:用于表示空值或者不存在的字段,{“x”:null}

布爾型:布爾類型有兩個(gè)值true和false,{“x”:true}

數(shù)值:shell默認(rèn)使用64為浮點(diǎn)型數(shù)值。{“x”:3.14}或{“x”:3}。對于整型值,可以使用 NumberInt(4字節(jié)符號(hào)整數(shù))或NumberLong(8字節(jié)符號(hào)整數(shù)), {“x”:NumberInt(“3”)}{“x”:NumberLong(“3”)}

字符串:UTF-8字符串都可以表示為字符串類型的數(shù)據(jù),{“x”:“呵呵”}

日期:日期被存儲(chǔ)為自新紀(jì)元依賴經(jīng)過的毫秒數(shù),不存儲(chǔ)時(shí)區(qū),{“x”:new Date()}

正則表達(dá)式:查詢時(shí),使用正則表達(dá)式作為限定條件,語法與JavaScript的正則表達(dá)式相 同,{“x”:/[abc]/}

數(shù)組:數(shù)據(jù)列表或數(shù)據(jù)集可以表示為數(shù)組,{“x”: [“a“,“b”,”c”]}

內(nèi)嵌文檔:文檔可以嵌套其他文檔,被嵌套的文檔作為值來處理,{“x”:{“y”:3 }}

對象Id:對象id是一個(gè)12字節(jié)的字符串,是文檔的唯一標(biāo)識(shí),{“x”: objectId() }

二進(jìn)制數(shù)據(jù):二進(jìn)制數(shù)據(jù)是一個(gè)任意字節(jié)的字符串。它不能直接在shell中使用。如果要 將非utf-字符保存到數(shù)據(jù)庫中,二進(jìn)制數(shù)據(jù)是唯一的方式。 代碼:查詢和文檔中可以包括任何JavaScript代碼,{“x”:function(){/…/}}

2.MongoDB安裝與啟動(dòng)

2.1.1 window系統(tǒng)MongoDB安裝

安裝 雙擊“資源\微服務(wù)相關(guān)\配套軟件\mongodb”中的“mongodb-win32-x86_64-2008plusssl- 3.2.10-signed.msi” 按照提示步驟安裝即可。安裝完成后,軟件會(huì)安裝在C:\Program Files\MongoDB 目錄中。

我們要啟動(dòng)的服務(wù)程序就是C:\Program Files\MongoDB\Server\3.2\bin目錄下的 mongod.exe,為了方便我們每次啟動(dòng),我將C:\Program Files\MongoDB\Server\3.2\bin 設(shè)置到環(huán)境變量path中。

啟動(dòng)

(1)首先打開命令提示符,創(chuàng)建一個(gè)用于存放數(shù)據(jù)的目錄

md d:\data

(2)啟動(dòng)服務(wù)

mongod ‐‐dbpath=d:\data

我們在啟動(dòng)信息中可以看到,mongoDB的默認(rèn)端口是27017 如果我們想改變默認(rèn)的啟動(dòng)端口,可以通過--port來指定端口 在命令提示符輸入以下命令即可完成登陸

mongo

退出mongodb

exit

2.2 常用命令

2.2.1 選擇和創(chuàng)建數(shù)據(jù)庫

選擇和創(chuàng)建數(shù)據(jù)庫的語法格式:

use 數(shù)據(jù)庫名稱

如果數(shù)據(jù)庫不存在則自動(dòng)創(chuàng)建 以下語句創(chuàng)建spit數(shù)據(jù)庫

use spitdb

2.2.2 插入與查詢文檔

插入文檔的語法格式:

db.集合名稱.insert(數(shù)據(jù));

我們這里可以插入以下測試數(shù)據(jù):

db.spit.insert({content:"聽說十次方課程很給力呀",userid:"1011",nickname:"小雅",visits:NumberInt(902)})

查詢集合的語法格式:

db.集合名稱.find()

如果我們要查詢spit集合的所有文檔,我們輸入以下命令

db.spit.find()

這里你會(huì)發(fā)現(xiàn)每條文檔會(huì)有一個(gè)叫_id的字段,這個(gè)相當(dāng)于我們原來關(guān)系數(shù)據(jù)庫中表的主 鍵,當(dāng)你在插入文檔記錄時(shí)沒有指定該字段,MongoDB會(huì)自動(dòng)創(chuàng)建,其類型是ObjectID 類型。如果我們在插入文檔記錄時(shí)指定該字段也可以,其類型可以是ObjectID類型,也 可以是MongoDB支持的任意類型。

輸入以下測試語句:

db.spit.insert({_id:"1",content:"我還是沒有想明白到底為啥出錯(cuò)",userid:"1012",nickname:"小明",visits:NumberInt(2020)});

db.spit.insert({_id:"2",content:"加班到半夜",userid:"1013",nickname:"凱撒",visits:NumberInt(1023)});

db.spit.insert({_id:"3",content:"手機(jī)流量超了咋辦?",userid:"1013",nickname:"凱撒",visits:NumberInt(111)});

db.spit.insert({_id:"4",content:"堅(jiān)持就是勝利",userid:"1014",nickname:"諾諾",visits:NumberInt(1223)});

如果我想按一定條件來查詢,比如我想查詢userid為1013的記錄,怎么辦?很簡單!只 要在find()中添加參數(shù)即可,參數(shù)也是json格式,如下:

db.spit.find({userid:'1013'})

如果你只需要返回符合條件的第一條數(shù)據(jù),我們可以使用findOne命令來實(shí)現(xiàn)

db.spit.findOne({userid:'1013'})

如果你想返回指定條數(shù)的記錄,可以在find方法后調(diào)用limit來返回結(jié)果,例如:

db.spit.find().limit(3)

2.2.3 修改與刪除文檔

修改文檔的語法結(jié)構(gòu):

db.集合名稱.update(條件,修改后的數(shù)據(jù))

如果我們想修改_id為1的記錄,瀏覽量為1000,輸入以下語句:

db.spit.update({_id:"1"},{visits:NumberInt(1000)})

執(zhí)行后,我們會(huì)發(fā)現(xiàn),這條文檔除了visits字段其它字段都不見了,為了解決這個(gè)問題, 我們需要使用修改器$set來實(shí)現(xiàn),命令如下:

db.spit.update({_id:"2"},{$set:{visits:NumberInt(2000)}})

這樣就OK啦。

刪除文檔的語法結(jié)構(gòu):

db.集合名稱.remove(條件)

以下語句可以將數(shù)據(jù)全部刪除,請慎用

db.spit.remove({})

如果刪除visits=1000的記錄,輸入以下語句

db.spit.remove({visits:1000})

2.2.4 統(tǒng)計(jì)條數(shù)

統(tǒng)計(jì)記錄條件使用count()方法。以下語句統(tǒng)計(jì)spit集合的記錄數(shù)

db.spit.count()

如果按條件統(tǒng)計(jì) ,例如:統(tǒng)計(jì)userid為1013的記錄條數(shù)

db.spit.count({userid:"1013"})

2.2.5 模糊查詢

MongoDB的模糊查詢是通過正則表達(dá)式的方式實(shí)現(xiàn)的。格式為:

/模糊查詢字符串/

例如,我要查詢吐槽內(nèi)容包含“流量”的所有文檔,代碼如下:

db.spit.find({content:/流量/})

如果要查詢吐槽內(nèi)容中以“加班”開頭的,代碼如下:

db.spit.find({content:/^加班/})

2.2.6 大于 小于 不等于

<, <=, >, >= 這個(gè)操作符也是很常用的,格式如下:

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}})

2.2.7 包含與不包含

包含使用$in操作符。

示例:查詢吐槽集合中userid字段包含1013和1014的文檔

db.spit.find({userid:{$in:["1013","1014"]}})

不包含使用$nin操作符。

示例:查詢吐槽集合中userid字段不包含1013和1014的文檔

db.spit.find({userid:{$nin:["1013","1014"]}})

2.2.8 條件連接

我們?nèi)绻枰樵兺瑫r(shí)滿足兩個(gè)以上條件,需要使用$and操作符將條件進(jìn)行關(guān)聯(lián)。(相當(dāng)于SQL的and)

格式為:

$and:[ { },{ },{ } ]

示例:查詢吐槽集合中visits大于等于1000 并且小于2000的文檔

db.spit.find({$and:[ {visits:{$gte:1000}} ,{visits:{$lt:2000} }]})

如果兩個(gè)以上條件之間是或者的關(guān)系,我們使用or操作符進(jìn)行關(guān)聯(lián),與前面and的使用方式相同格式為:

$or:[ { },{ },{ } ]

示例:查詢吐槽集合中userid為1013,或者瀏覽量小于2000的文檔記錄

db.spit.find({$or:[ {userid:"1013"} ,{visits:{$lt:2000} }]})

2.2.9 列值增長

如果我們想實(shí)現(xiàn)對某列值在原有值的基礎(chǔ)上進(jìn)行增加或減少,可以使用$inc運(yùn)算符來實(shí)現(xiàn)

db.spit.update({_id:"2"},{$inc:{visits:NumberInt(1)}} )

3.Java操作MongoDB

3.1 mongodb-driver

mongodb-driver是mongo官方推出的java連接mongoDB的驅(qū)動(dòng)包,相當(dāng)于JDBC驅(qū)動(dòng)。我們通過一個(gè)入門的案例來了解mongodb-driver的基本使用

3.1.1 查詢?nèi)坑涗?/h4>

(1)創(chuàng)建工程 mongoDemo, 引入依賴

<dependencies>
      <dependency>
          <groupId>org.mongodb</groupId>
          <artifactId>mongodb‐driver</artifactId>
          <version>3.6.3</version>
      </dependency>
</dependencies>

(2)創(chuàng)建測試類

/**
* MongoDb入門小demo
*/
public class MongoDemo {
public static void main(String[] args) {
	MongoClient client=new MongoClient("192.168.184.134");//創(chuàng)建連接
	MongoDatabase spitdb = client.getDatabase("spitdb");//打開數(shù)據(jù)庫
	MongoCollection<Document> spit = spitdb.getCollection("spit");//
獲取集合
	FindIterable<Document> documents = spit.find();//查詢記錄獲取文檔集
合
	for(Document document:documents){ //
		System.out.println("內(nèi)容:"+ document.getString("content"));
		System.out.println("用戶ID:"+document.getString("userid"));
		System.out.println("瀏覽量:"+document.getInteger("visits"));
	}
	client.close();//關(guān)閉連接
    }
}

3.1.2 條件查詢

BasicDBObject對象:表示一個(gè)具體的記錄,BasicDBObject實(shí)現(xiàn)了DBObject,是keyvalue 的數(shù)據(jù)結(jié)構(gòu),用起來和HashMap是基本一致的。

(1)查詢userid為1013的記錄

public class MongoDemo1 {
public static void main(String[] args) {
	MongoClient client=new MongoClient("192.168.184.134");//創(chuàng)建連接
	MongoDatabase spitdb = client.getDatabase("spitdb");//打開數(shù)據(jù)庫
	MongoCollection<Document> spit = spitdb.getCollection("spit");//
獲取集合
	BasicDBObject bson=new BasicDBObject("userid","1013");// 構(gòu)建查詢
條件
	FindIterable<Document> documents = spit.find(bson);//查詢記錄獲取結(jié)
果集合
	for(Document document:documents){ //
		System.out.println("內(nèi)容:"+ document.getString("content"));
		System.out.println("用戶ID:"+document.getString("userid"));
		System.out.println("瀏覽量:"+document.getInteger("visits"));
	}
	client.close();//關(guān)閉連接
	}
}

(2)查詢?yōu)g覽量大于1000的記錄

public class MongoDemo2 {
public static void main(String[] args) {
	MongoClient client=new MongoClient("192.168.184.134");//創(chuàng)建連接
	MongoDatabase spitdb = client.getDatabase("spitdb");//打開數(shù)據(jù)庫
	MongoCollection<Document> spit = spitdb.getCollection("spit");//
獲取集合
	BasicDBObject bson=new BasicDBObject("visits",new
	BasicDBObject("$gt",1000) );// 構(gòu)建查詢條件
	FindIterable<Document> documents = spit.find(bson);//查詢記錄獲取結(jié)
果集合
	for(Document document:documents){ //
		System.out.println("內(nèi)容:"+ document.getString("content"));
		System.out.println("用戶ID:"+document.getString("userid"));
		System.out.println("瀏覽量:"+document.getInteger("visits"));
	}
	client.close();//關(guān)閉連接
    }
}

3.1.3 插入數(shù)據(jù)

public class MongoDemo3 {
public static void main(String[] args) {
	MongoClient client=new MongoClient("192.168.184.134");//創(chuàng)建連接
	MongoDatabase spitdb = client.getDatabase("spitdb");//打開數(shù)據(jù)庫
	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);//插入數(shù)據(jù)
	client.close();
}
}

看完上述內(nèi)容,你們掌握文檔型數(shù)據(jù)庫MongoDB是怎樣的的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

分享名稱:文檔型數(shù)據(jù)庫MongoDB是怎樣的
鏈接URL:http://muchs.cn/article2/jejgic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、域名注冊、動(dòng)態(tài)網(wǎng)站、網(wǎng)站排名網(wǎng)站維護(hù)、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司