1. 程式人生 > >【mongodb】Mongodb初識

【mongodb】Mongodb初識

MongoDB 是一個基於分散式檔案儲存的資料庫。由 C++ 語言編寫。旨在為 WEB 應用提供可擴充套件的高效能資料儲存解決方案。

MongoDB 是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。

NoSQL

NoSQL,指的是非關係型的資料庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同於傳統的關係型資料庫的資料庫管理系統的統稱。

NoSQL用於超大規模資料的儲存。(例如谷歌或Facebook每天為他們的使用者收集萬億位元的資料)。這些型別的資料儲存不需要固定的模式,無需多餘操作就可以橫向擴充套件。

MongoDB 將資料儲存為一個文件,資料結構由鍵值(key=>value)對組成。MongoDB 文件類似於 JSON 物件。欄位值可以包含其他文件,陣列及文件陣列。

mongoDB安裝

https://www.cnblogs.com/cbw-mango/p/7987682.html

也可以下載msi格式的 http://www.runoob.com/mongodb/mongodb-window-install.html

問題:安裝mongodb時,最後一步,一直卡著不動

是因為到最後一步時,左下角的勾勾沒有去掉,mongodb compass是圖形化管理介面,下載它需要很久很久,還有可能一直下不來,所以把勾去掉就能馬上安裝好。

 基礎

在mongodb中基本的概念是文件、集合、資料庫,

SQL術語/概念

MongoDB

術語/概念

解釋/說明

database

database

資料庫

table

collection

資料庫表/集合

row

document

資料記錄行/文件

column

field

資料欄位/域

index

index

索引

table joins

 

表連線,MongoDB不支援

primary key

primary key

主鍵,MongoDB自動將_id欄位設定為主鍵

 

通過下圖例項,我們也可以更直觀的瞭解Mongo中的一些概念:

 

 

一個mongodb中可以建立多個數據庫。

MongoDB的預設資料庫為"db",該資料庫儲存在data目錄中。

MongoDB的單個例項可以容納多個獨立的資料庫,每一個都有自己的集合和許可權,不同的資料庫也放置在不同的檔案中。

"show dbs" 命令可以顯示所有資料庫的列表。

Show collections  顯示所有表(集合)的列表

在 MongoDB 中,你不需要建立集合。當你插入一些文件時,MongoDB 會自動建立集合。

 

文件的資料結構和JSON基本一樣。

所有儲存在集合中的資料都是BSON格式。

BSON是一種類json的一種二進位制形式的儲存格式,簡稱Binary JSON

例如:

{

Name: xx,

Title:yy

}

 語句

【命令列/Robo視覺化工具】

插入

向集合(表)中插入文件(行)

>db.col.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一個 Nosql 資料庫',
    by: '菜鳥教程',
    url: 'http://www.runoob.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})

以上例項中 col 是我們的集合名,如果該集合不在該資料庫中, MongoDB 會自動建立該集合並插入文件。

檢視已插入文件:

> db.col.find()

插入文件你也可以使用 db.col.save(document) 命令。如果不指定 _id 欄位 save() 方法類似於 insert() 方法。如果指定 _id 欄位,則會更新該 _id 的資料。

更新

MongoDB 使用 update() 和 save() 方法來更新集合中的文件。

db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})

標題(title)由原來的 "MongoDB 教程" 更新為了 "MongoDB"。

save() 方法通過傳入的文件來替換已有文件。

C# 中判斷是否更新成功

 

可以通過updateResult.ModifedCount>0 去判斷

  

查詢

MongoDB 與 RDBMS Where 語句比較

如果你熟悉常規的 SQL 資料,通過下表可以更好的理解 MongoDB 的條件語句查詢:

操作

格式

範例

RDBMS中的類似語句

等於

{<key>:<value>}

db.col.find({"by":"菜鳥教程"}).pretty()

where by =

'菜鳥教程'

小於

{<key>:{$lt:<value>}}

db.col.find({"likes":{$lt:50}}).pretty()

where likes

< 50

小於或等於

{<key>:{$lte:<value>}}

db.col.find({"likes":{$lte:50}}).pretty()

where likes

<= 50

大於

{<key>:{$gt:<value>}}

db.col.find({"likes":{$gt:50}}).pretty()

where likes

> 50

大於或等於

{<key>:{$gte:<value>}}

db.col.find({"likes":{$gte:50}}).pretty()

where likes

>= 50

不等於

{<key>:{$ne:<value>}}

db.col.find({"likes":{$ne:50}}).pretty()

where likes

!= 50

 

find() 方法以非結構化的方式來顯示所有文件。

如果你需要以易讀的方式來讀取資料,可以使用 pretty() 方法,語法格式如下:

>db.col.find().pretty()

pretty() 方法以格式化的方式來顯示所有文件。

除了 find() 方法之外,還有一個 findOne() 方法,它只返回一個文件。

多條件 且查詢,等同and

MongoDB 的 find() 方法可以傳入多個鍵(key),每個鍵(key)以逗號隔開,即常規 SQL 的 AND 條件。

db.col.find({key1:value1, key2:value2})

或查詢 or

db.col.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
)

查詢大於某個時間,小於某個時間,在某一段時間範圍

(>) 大於 - $gt

(<) 小於 - $lt

(>=) 大於等於 - $gte

(<= ) 小於等於 - $lte

1.Date方式

例如查詢ct>=2012.12.7 且et<=2012.12.7:可翻譯為

"ct":{$gte:new Date(2012,11,7)},"et":{$lte:new Date(2012,11,7)}

如下是查詢日期大於等於2016年12月1日的記錄條數(注意,中間的月份寫11,就是12月)

db.xxx.find({"ct":{$gte:new Date(2016,11,1)}})

2.ISODate方式

ISODate("2016-01-01T00:00:00Z")

查詢某些欄位

完整的定義

db.collection.find(query, projection)

若不指定 projection,則預設返回所有鍵,指定 projection 格式如下,有兩種模式

db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的鍵,不返回其他鍵。。1代表包括
db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的鍵,返回其他鍵

_id 鍵預設返回,需要主動指定 _id:0 才會隱藏

兩種模式不可混用(因為這樣的話無法推斷其他鍵是否應返回)

db.collection.find(query, {title: 1, by: 0}) // 錯誤

只能全1或全0,除了在inclusion模式時可以指定_id為0

db.collection.find(query, {_id:0, title: 1, by: 1}) // 正確

 

若不想指定查詢條件引數 query 可以 用 {} 代替,但是需要指定 projection 引數:

querydb.collection.find({}, {title: 1})
querydb.collection.find({})  也是可以的

限定結果條數

如果你需要在MongoDB中讀取指定數量的資料記錄,可以使用MongoDB的Limit方法,limit()方法接受一個數字引數,該引數指定從MongoDB中讀取的記錄條數。

db.COLLECTION_NAME.find().limit(NUMBER)

還可以使用skip()方法來跳過指定數量的資料,skip方法同樣接受一個數字引數作為跳過的記錄條數。

db.col.find({},{"title":1,_id:0}).limit(1).skip(1)

以下例項只會顯示第二條文件資料

 

想要讀取從 10 條記錄後 100 條記錄,相當於 sql 中limit (10,100)。

> db.COLLECTION_NAME.find().skip(10).limit(100)

以上例項在集合中跳過前面 10 條返回 100 條資料。

skip 和 limit 結合就能實現分頁。

不要輕易使用Skip來做查詢,否則資料量大了就會導致效能急劇下降,這是因為Skip是一條一條的數過來的,多了自然就慢了。

排序

降序:sort({MailSendTime:-1})

sort() 方法可以通過引數指定排序的欄位,並使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而 -1 是用於降序排列。

索引

索引是特殊的資料結構,索引儲存在一個易於遍歷讀取的資料集合中,索引是對資料庫表中一列或多列的值進行排序的一種結構

db.collection.createIndex(keys, options)

語法中 Key 值為你要建立的索引欄位,1 為指定按升序建立索引,如果你想按降序來建立索引指定為 -1 即可。

>db.col.createIndex({"title":1})

createIndex() 方法中你也可以設定使用多個欄位建立索引(關係型資料庫中稱作複合索引)。

>db.col.createIndex({"title":1,"description":-1})

聚合

MongoDB中聚合(aggregate)主要用於處理資料(諸如統計平均值,求和等),並返回計算後的資料結果。有點類似sql語句中的 count(*)。

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])

通過欄位 by_user 欄位對資料進行分組,並計算 by_user 欄位相同值的總和。

_id、num_tutorial 是結果的別名

 

 Robo工具的使用

1、顯示1000條,右邊切換不同的顯示

 

 

複製資料

 

需要使用mongodump備份與恢復

命令列中執行:

備份

Mongodump –h 127.0.0.1 –d testOne –o e:\mongodb\data\dump

備份本地mongo中的testOne資料庫到本地目錄e:\mongodb\data\dump下,會自動建立資料夾testOne

遠端:

mongodump –h xxxx:27001 –d DB –o e:\mongodb\data\dump\dev

還原

mongorestore -h 127.0.0.1 -d db e:\mongodb\data\dump\dev\InfrastructureDB