溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

文檔型數據庫MongoDB是怎樣的

發布時間:2021-09-29 11:34:04 來源:億速云 閱讀:176 作者:柒染 欄目:大數據

文檔型數據庫MongoDB是怎樣的,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

1、 MongoDB簡介

1.1什么是MongoDB

MongoDB 是一個跨平臺的,面向文檔的數據庫,是當前 NoSQL 數據庫產品中最熱門的一種。它介于關系數據庫和非關系數據庫之間,是非關系數據庫當中功能最豐富,最像關系數據庫的產品。它支持的數據結構非常松散,是類似 JSON 的 BSON 格式,因此可以存儲比較復雜的數據類型。 MongoDB 的官方網站地址是:http://www.mongodb.org/

1.2 MongoDB特點

MongoDB 最大的特點是他支持的查詢語言非常強大,其語法有點類似于面向對象 的查 詢語言,幾乎可以實現類似關系數據庫單表查詢的絕大部分功能,而且還支持對數據建 立索 引。它是一個面向集合的,模式自由的文檔型數據庫。 具體特點總結如下:

(1)面向集合存儲,易于存儲對象類型的數據

(2)模式自由

(3)支持動態查詢

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

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

(6)使用高效的二進制數據存儲,包括大型對象(如視頻等)

(7)自動處理碎片,以支持云計算層次的擴展性

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

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

1.3 MongoDB體系結構

MongoDB 的邏輯結構是一種層次結構。主要由: 文檔(document)、集合(collection)、數據庫(database)這三部分組成的。邏輯結構是面向用戶的,用戶使用 MongoDB 開發應用程序使用的就是邏輯結構。

(1)MongoDB 的文檔(document),相當于關系數據庫中的一行記錄。

(2)多個文檔組成一個集合(collection),相當于關系數據庫的表。

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

(4)一個 MongoDB 實例支持多個數據庫(database)。 文檔(document)、集合(collection)、數據庫(database)的層次結構如下圖: 文檔型數據庫MongoDB是怎樣的

下表是MongoDB與MySQL數據庫邏輯結構概念的對比 文檔型數據庫MongoDB是怎樣的

1.4 數據類型

基本數據類型

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(){/…/}}

2.MongoDB安裝與啟動

2.1.1 window系統MongoDB安裝

安裝 雙擊“資源\微服務相關\配套軟件\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

2.2 常用命令

2.2.1 選擇和創建數據庫

選擇和創建數據庫的語法格式:

use 數據庫名稱

如果數據庫不存在則自動創建 以下語句創建spit數據庫

use spitdb

2.2.2 插入與查詢文檔

插入文檔的語法格式:

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)

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

2.2.4 統計條數

統計記錄條件使用count()方法。以下語句統計spit集合的記錄數

db.spit.count()

如果按條件統計 ,例如:統計userid為1013的記錄條數

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

2.2.5 模糊查詢

MongoDB的模糊查詢是通過正則表達式的方式實現的。格式為:

/模糊查詢字符串/

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

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

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

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

2.2.6 大于 小于 不等于

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

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 條件連接

我們如果需要查詢同時滿足兩個以上條件,需要使用$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} }]})

2.2.9 列值增長

如果我們想實現對某列值在原有值的基礎上進行增加或減少,可以使用$inc運算符來實現

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

3.Java操作MongoDB

3.1 mongodb-driver

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

3.1.1 查詢全部記錄

(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();//關閉連接
    }
}

3.1.2 條件查詢

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();//關閉連接
    }
}

3.1.3 插入數據

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是怎樣的的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女