【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中的類似語句 |
等於 |
|
|
|
小於 |
|
|
|
小於或等於 |
|
|
|
大於 |
|
|
|
大於或等於 |
|
|
|
不等於 |
|
|
|
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