最後更新時間:2017-07-13 11:10:49html
原始文章連接:http://www.lovebxm.com/2017/07/13/mongodb_primer/node
MongoDB - 簡介web
官網:https://www.mongodb.com/sql
MongoDB 是一個基於分佈式文件存儲的數據庫,由 C++ 語言編寫,旨在爲 WEB 應用提供可擴展的高性能數據存儲解決方案。mongodb
MongoDB 是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。shell
MongoDB - 安裝及運行數據庫
07/05/2017 Current Stable Release (3.4.6)編程
https://www.mongodb.com/download-center#community數組
MongoDB 將數據目錄存儲在 db 目錄下,需手動建立。瀏覽器
E:\MongoDB\data\db
爲了從命令提示符下運行MongoDB服務器,你必須從MongoDB\bin
目錄中執行mongod.exe
文件,不要關閉服務。ctrl + c
關閉。
mongod.exe --dbpath E:\MongoDB\data\db
運行 mongo.exe
MongoDB Shell是MongoDB自帶的交互式Javascript shell,用來對MongoDB進行操做和管理的交互式環境。
添加系統環境 path E:\MongoDB\Server\3.4\bin
檢測:cmd 中輸入 mongod --help
新建文件:E:\MongoDB\logs\logs.log
將 MongoDB 服務器做爲 Windows 服務隨 Windows 啓動而開啓:
mongod.exe --logpath "E:\MongoDB\logs\logs.log" --logappend --dbpath "E:\MongoDB\data" --directoryperdb --serviceName MongoDB --install
開啓 MongoDB 服務:net start MongoDB
中止 MongoDB 服務:net stop MongoDB
刪除 MongoDB 服務:sc delete MongoDB
接下來就能夠在 cmd 中運行 E:\MongoDB\Server\3.4\bin
裏面的 *.exe
程序了
mongo
mongorestore
mongodump
mongoDB - 主要特色
mongoDB - 工具
監控
GUI
mongoDB - 三大重要概念
1. database 數據庫
多個集合邏輯上組織在一塊兒,就是數據庫。
數據庫命名規範:
有一些數據庫名是保留的,能夠直接訪問這些有特殊做用的數據庫。
2. collection 集合
多個文檔組成一個集合,至關於關係數據庫的表。
全部存儲在集合中的數據都是 BSON 格式,BSON 是類 JSON 的一種二進制形式的存儲格式,簡稱 Binary JSON。
集合名命名規範:
3. document 文檔
MongoDB 將數據存儲爲一個文檔,數據結構由鍵值對組成。
MongoDB 文檔是一組鍵值對(即BSON,二進制的 JSON),相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組。
文檔鍵命名規範:
須要注意的是:
MongoDB - 數據類型
ObjectId:主鍵,一種特殊並且很是重要的類型,每一個文檔都會默認配置這個屬性,屬性名爲_id,除非本身定義,方可覆蓋
MongoDB - 常見操做
查看當前數據庫
db
查看全部數據庫
沒有數據的數據庫不予顯示
MongoDB 中默認的數據庫爲 test,若是你沒有建立新的數據庫,集合將存放在 test 數據庫中。
show dbs
鏈接到指定的數據庫
若是數據庫不存在,則建立數據庫,不然切換到指定數據庫。
use db_name
查看服務器狀態
db.serverStatus()
查看數據庫統計信息
db.stats()
刪除數據庫
db.dropDatabase()
查看數據庫中全部集合
show tables 或 show collections
清空集合
刪除裏面的文檔,但集合還在
db.col_name.remove({})
刪除集合
db.col_name.drop()
查看集合詳細信息
MongoDB 的3.0後的版本分了三種模式 queryPlanner、executionStats、allPlansExecution
db.col_name.find({key:value}).explain("allPlansExecution")
MongoDB - 增刪改查
插入
MongoDB 使用 insert() 或 save() 方法向集合中插入文檔:
若是該集合不在該數據庫中, MongoDB 會自動建立該集合並插入文檔。
insert() 或 save() 方法均可以向collection裏插入數據,二者區別:
db.col_name.insert(document) db.col_name.save(document)
插入一個文檔到 col 集合中:
db.col_1.insert({ title: 'MongoDB 教程', description: 'MongoDB 是一個 Nosql 數據庫', by: '菜鳥教程', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 })
也能夠將文檔數據定義爲一個變量,以下所示:
document = ({ title: 'MongoDB 教程', description: 'MongoDB 是一個 Nosql 數據庫', by: '菜鳥教程', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 }); db.col_2.insert(document)
刪除
remove() 函數是用來刪除集合中的數據
在執行 remove() 函數前先執行 find() 命令來判斷執行的條件是否正確,這是一個比較好的習慣。
db.col_name.remove( <query>, { justOne: <boolean>, writeConcern: <document> } ) - query :(可選)刪除的文檔的條件。 - justOne : (可選)若是設爲 true 或 1,則只刪除一個文檔。 - writeConcern :(可選)拋出異常的級別。
刪除集合中全部文檔
db.col.remove({})
移除 col_1 集合中 title 爲 MongoDB save 的文檔,只刪除第一條找到的記錄
db.col_1.remove({'title':'MongoDB save'}, 1)
更新
MongoDB 使用 update() 和 save() 方法來更新集合中的文檔
update() 方法用於更新已存在的文檔
db.col_name.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } ) - query : update 的查詢條件,相似sql update查詢內where後面的。 - update : update的對象和一些更新的操做符(如$,$inc...)等,也能夠理解爲sql update查詢內set後面的 - upsert : 可選,這個參數的意思是,若是不存在 update 的記錄,是否插入記錄,true 爲插入,默認是 false,不插入。 - multi : 可選,mongodb 默認是false,只更新找到的第一條記錄,若是這個參數爲true,就把按條件查出來多條記錄所有更新。 - writeConcern :可選,拋出異常的級別。
經過 update() 方法來更新 col_1 集合中的 title
$set 操做符爲部分更新操做符,只更新 $set 以後的數據,而不是覆蓋以前的數據
db.col_1.update({ 'title': 'MongoDB 教程' }, { $set: { 'title': 'MongoDB' } })
以上語句只會修改第一條發現的文檔,若是要修改多條相同的文檔,則須要設置 multi 參數爲 true。
db.col_1.update({ 'title': 'MongoDB 教程' }, { $set: { 'title': 'MongoDB' } }, { multi: true })
save() 方法經過傳入的文檔來替換已有文檔。語法格式以下:
db.col_name.save( <document>, { writeConcern: <document> } )
如下實例中咱們替換了 col_1 的文檔數據:
document = ({ "_id": "1", "title": "MongoDB save", "description": "MongoDB 是一個 Nosql 數據庫", "by": "菜鳥", "url": "http://www.runoob.com", "tags": ["mongodb", "database", "NoSQL"], }); db.col_1.save(document)
查詢
find() 方法,它返回集合中全部文檔。
findOne() 方法,它只返回一個文檔。
db.col_name.find(query, projection) - query :可選,使用查詢操做符指定查詢條件 - projection :可選,使用投影操做符指定返回的鍵。查詢時返回文檔中全部鍵值, 只需省略該參數便可(默認省略)。
格式化輸出:
db.col_name.find().pretty()
查看集合中文檔的個數:
db.col_name.find().count()
跳過指定數量的數據:
db.col_name.find().skip()
讀取指定記錄的條數:
db.col_name.find().limit()
排序:
sort()方法能夠經過參數指定排序的字段,並使用 1 和 -1 來指定排序的方式,其中 1 爲升序排列,而-1是用於降序排列。
db.col_name.find().sort({key:1})
sort()方法能夠經過參數指定排序的字段,並使用 1 和 -1 來指定排序的方式,其中 1 爲升序排列,而-1是用於降序排列。
若是你想獲取"col"集合中 "likes" 大於100,小於 200 的數據,你可使用如下命令:
db.col.find({likes : {$lt :200, $gt : 100}}) // 相似於SQL語句: Select * from col where likes>100 AND likes<200;
條件操做符 | 中文 | 全英文 |
---|---|---|
$gt | 大於 | greater than |
$gte | 大於等於 | greater than equal |
$lt | 小於 | less than |
$lte | 小於等於 | less than equal |
$ne | 不等於 | not equal |
用來檢索集合中匹配的數據類型
若是想獲取 "col" 集合中 title 爲 String 的數據,你可使用如下命令:
db.col.find({"title" : {$type : 2}})
find() 方法能夠傳入多個鍵(key),每一個鍵(key)以逗號隔開,語法格式以下:
db.col_name.find({key1:value1, key2:value2}).pretty() // 相似於 SQL and 語句: SELECT * FROM col_name WHERE key1='value1' AND key2=value2
db.col_name.find({ $or: [{ "by": "菜鳥教程" }, { "title": "MongoDB 教程" }] }).pretty() // 相似於 SQL or 語句: SELECT * FROM col_name WHERE key1=value1 OR key2=value2
db.col_name.find({ "likes": { $gt: 50 }, $or: [{ "by": "菜鳥教程" }, { "title": "MongoDB 教程" }] }).pretty() // 相似常規 SQL 語句: SELECT * FROM col_name where likes>50 AND (by = '菜鳥教程' OR title = 'MongoDB 教程')
MongoDB - 索引
注意:從 mongoDB 3.0 開始,ensureIndex 被廢棄,從此都僅僅是 createIndex 的一個別名。
索引一般可以極大的==提升查詢的效率==,若是沒有索引,MongoDB在讀取數據時必須掃描集合中的每一個文件並選取那些符合查詢條件的記錄。
這種掃描全集合的查詢效率是很是低的,特別在處理大量的數據時,查詢能夠要花費幾十秒甚至幾分鐘,這對網站的性能是很是致命的。
索引是特殊的數據結構,索引存儲在一個易於遍歷讀取的數據集合中,索引是對數據庫表中一列或多列的值進行排序的一種結構
索引經常使用命令
getIndexes 查看集合索引狀況
db.col_name.getIndexes()
hint 強制使用索引
db.col_name.find({age:{$lt:30}}).hint({name:1, age:1}).explain()
刪除索引(不會刪除 _id 索引)
db.col_name.dropIndexes() db.col_name.dropIndex({firstname: 1})
createIndex() 方法
MongoDB使用 createIndex() 方法來建立索引
key 爲你要建立的索引字段,1爲按升序建立索引,-1爲按降序建立索引。
也能夠設置使用多個字段建立索引(關係型數據庫中稱做複合索引)
db.col_name.createIndex({key:1})
createIndex() 接收可選參數,可選參數列表以下:
對於每一個插入的數據,都會自動生成一條惟一的 _id 字段,_id 索引是絕大多數集合默認創建的索引
> db.col_1.insert({x:10}) WriteResult({ "nInserted" : 1 }) > db.col_1.find() { "_id" : ObjectId("59658e56aaf42d1c98dd95a2"), "x" : 10 } > db.col_1.getIndexes() [ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "runoob.col_1" } ]
字段解釋:
v 表示 version,在 Mongo3.2 以前的版本中,會存在 {v:0}(版本鎖爲0)的狀況。在3.2以後的版本中,{v:0} 再也不容許使用,這部分能夠不去關注,由於 v 由系統自動管理
key 表示做爲索引的鍵。1 或 -1表示排序模式,1爲升序,1爲降序
name 表示索引的名字,默認生成名稱的規則是做爲索引的字段_排序模式
數據庫名稱.集合名稱
組成最普通的索引,不會自動建立
// 對 x 字段建立升序索引 > db.col_1.createIndex({x:1}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } > db.col_1.find() { "_id" : ObjectId("59658e56aaf42d1c98dd95a2"), "x" : 10 } > db.col_1.getIndexes() [ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "runoob.col_1" }, { "v" : 2, "key" : { "x" : 1 }, "name" : "x_1", "ns" : "runoob.col_1" } ]
單鍵索引的值爲一個單一的值,多鍵索引的值有多個數據(如數組)
若是mongoDB中插入數組類型的多鍵數據,索引是自動創建的,無需刻意指定
> db.col_1.insert({z:[1,2,3,4,5]}) WriteResult({ "nInserted" : 1 }) > db.col_1.find() { "_id" : ObjectId("59658e56aaf42d1c98dd95a2"), "x" : 10 } { "_id" : ObjectId("5965923eaaf42d1c98dd95a3"), "y" : 20 } { "_id" : ObjectId("59659828aaf42d1c98dd95a4"), "z" : [ 1, 2, 3, 4, 5 ] } > db.col_1.find({z:3}) { "_id" : ObjectId("59659828aaf42d1c98dd95a4"), "z" : [ 1, 2, 3, 4, 5 ] }
同時對多個字段建立索引
> db.col_2.insert({x:10,y:20,z:30}) WriteResult({ "nInserted" : 1 }) > db.col_2.find() { "_id" : ObjectId("59659a57aaf42d1c98dd95a5"), "x" : 10, "y" : 20, "z" : 30 } > db.col_2.createIndex({x:1,y:1}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } > db.col_2.getIndexes() [ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "runoob.col_2" }, { "v" : 2, "key" : { "x" : 1, "y" : 1 }, "name" : "x_1_y_1", "ns" : "runoob.col_2" } ]
又稱 TTL(Time To Live,生存時間)索引,即在一段時間後會過時的索引(如登陸信息、日誌等)
過時後的索引會連同文檔一塊兒刪除
expireAfterSeconds:指定一個以秒爲單位的數值,設定集合的生存時間。
注意:
> db.col_3.insert({x:new Date()}) WriteResult({ "nInserted" : 1 }) > db.col_3.find() { "_id" : ObjectId("59659f3baaf42d1c98dd95a7"), "x" : ISODate("2017-07-12T04:02:03.835Z") } > db.col_3.createIndex({x:1},{expireAfterSeconds:10}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } > db.col_3.getIndexes() [ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "runoob.col_3" }, { "v" : 2, "key" : { "x" : 1 }, "name" : "x_1", "ns" : "runoob.col_3", "expireAfterSeconds" : 10 } ] > db.col_3.find() // 無返回
場景:全網站關鍵詞搜索
key-value 中,key 此時爲 $**
(也能夠是具體某 key),value 此時爲一個固定的字符串(如 text
)
全文索引類似度,與 sort 函數一塊兒使用效果更好
db.col_7.find({ $text: { $search: "aa bb" } }, { score: { $meta: "textScore" } }).sort({ score: { $meta: "textScore" } })
注意:
或
非
與
(需用 \ 轉義)> db.col_7.find() { "_id" : ObjectId("5965aa84aaf42d1c98dd95b0"), "title" : "aa bb cc", "author" : "白小明", "article" : "這是白小明的一篇文章,標題《aa bb cc》" } { "_id" : ObjectId("5965aa8faaf42d1c98dd95b1"), "title" : "abc def", "author" : "白小明", "article" : "這是白小明的一篇文章,標題《aa bb cc》" } { "_id" : ObjectId("5965aedfaaf42d1c98dd95b2"), "title" : "aa bb", "author" : "白小明", "article" : "這是白小明的一篇文章,標題《aa bb cc》" } > db.col_7.createIndex({"title": "text"}) > db.col_7.find({$text:{$search:"aa"}}) { "_id" : ObjectId("5965aa84aaf42d1c98dd95b0"), "title" : "aa bb cc", "author" : "白小明", "article" : "這是白小明的一篇文章,標題《aa bb cc》" } { "_id" : ObjectId("5965aedfaaf42d1c98dd95b2"), "title" : "aa bb", "author" : "白小明", "article" : "這是白小明的一篇文章,標題《aa bb cc》" } > db.col_7.find({$text:{$search:"aa cc"}}) { "_id" : ObjectId("5965aa84aaf42d1c98dd95b0"), "title" : "aa bb cc", "author" : "白小明", "article" : "這是白小明的一篇文章,標題《aa bb cc》" } { "_id" : ObjectId("5965aedfaaf42d1c98dd95b2"), "title" : "aa bb", "author" : "白小明", "article" : "這是白小明的一篇文章,標題《aa bb cc》" } > db.col_7.find({$text:{$search:"\"aa\" \"cc\""}}) { "_id" : ObjectId("5965aa84aaf42d1c98dd95b0"), "title" : "aa bb cc", "author" : "白小明", "article" : "這是白小明的一篇文章,標題《aa bb cc》" } > db.col_7.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}}) { "_id" : ObjectId("5965aedfaaf42d1c98dd95b2"), "title" : "aa bb", "author" : "白小明", "article" : "這是白小明的一篇文章,標題《aa bb cc》", "score" : 1.5 } { "_id" : ObjectId("5965aa84aaf42d1c98dd95b0"), "title" : "aa bb cc", "author" : "白小明", "article" : "這是白小明的一篇文章,標題《aa bb cc》", "score" : 1.3333333333333333 } > db.col_7.dropIndexes() > db.col_7.createIndex({"author": "text"})) > db.col_7.find({$text:{$search:"小明"}})}) > > db.col_7.find({$text:{$search:"白小明"}}) { "_id" : ObjectId("5965aa84aaf42d1c98dd95b0"), "title" : "aa bb cc", "author" : "白小明", "article" : "這是白小明的一篇文章,標題《aa bb cc》" } { "_id" : ObjectId("5965aa8faaf42d1c98dd95b1"), "title" : "abc def", "author" : "白小明", "article" : "這是白小明的一篇文章,標題《aa bb cc》" } { "_id" : ObjectId("5965aedfaaf42d1c98dd95b2"), "title" : "aa bb", "author" : "白小明", "article" : "這是白小明的一篇文章,標題《aa bb cc》" }
查看最近的點
MongoDB - 聚合
==分組計算==
MongoDB 中聚合主要用於處理數據(如平均值,求和等),並返回計算後的數據結果。相似sql語句中的 count(*)。
aggregate() 方法
db.col_name.aggregate(AGGREGATE_OPERATION)
下表展現了一些聚合的表達式:
計算每一個做者所寫的文章數
在下面的例子中,咱們經過字段by_user字段對數據進行分組,並計算by_user字段相同值的總和。
集合中的數據以下:
{ "_id" : ObjectId("5963b992a812aa05b9d2e765"), "title" : "MongoDB Overview", "description" : "MongoDB is no sql database", "by_user" : "runoob.com", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 } { "_id" : ObjectId("5963b9aaa812aa05b9d2e766"), "title" : "NoSQL Overview", "description" : "No sql database is very fast", "by_user" : "runoob.com", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 10 } { "_id" : ObjectId("5963b9bba812aa05b9d2e767"), "title" : "Neo4j Overview", "description" : "Neo4j is no sql database", "by_user" : "Neo4j", "url" : "http://www.neo4j.com", "tags" : [ "neo4j", "database", "NoSQL" ], "likes" : 750 }
使用aggregate()計算結果以下:
db.col_1.aggregate([{ $group: { _id: "$by_user", num_tutorial: { $sum: 1 } } }]) // 返回 { "_id" : "Neo4j", "num_tutorial" : 1 } { "_id" : "runoob.com", "num_tutorial" : 2 } // 以上實例相似sql語句 select by_user, count(*) from col_1 group by by_user
聚合管道
管道在Unix和Linux中通常用於將當前命令的輸出結果做爲下一個命令的參數。
MongoDB 的聚合管道將MongoDB文檔在一個管道處理完畢後將結果傳遞給下一個管道處理。管道操做是能夠重複的。
表達式:處理輸入文檔並輸出。表達式是無狀態的,只能用於計算當前聚合管道的文檔,不能處理其它的文檔。
聚合管道經常使用的幾個操做:
$project 實例
0 爲不顯示,1爲顯示,默認狀況下 _id 字段是 1
db.articles.aggregate({ $project: { _id: 0, title: 1, by_user: 1, } }); // 返回 { "title" : "MongoDB Overview", "by_user" : "runoob.com" } { "title" : "NoSQL Overview", "by_user" : "runoob.com" } { "title" : "Neo4j Overview", "by_user" : "Neo4j" }
$match 實例
$match 用於獲取分數大於70小於或等於90記錄,而後將符合條件的記錄送到下一階段$group管道操做符進行處理。
db.articles.aggregate([ { $match: { score: { $gt: 70, $lte: 90 } } }, { $group: { _id: null, count: { $sum: 1 } } } ]); // 返回 { "_id" : null, "count" : 1 }
$skip 實例
通過 $skip 管道操做符處理後,前2個文檔被"過濾"掉。
db.col_1.aggregate({ $skip: 2 });
做者: 連接:http://www.imooc.com/article/19162?block_id=tuijian_wz 來源:慕課網 本文原創發佈於慕課網 ,轉載請註明出處,謝謝合做