mongodb笔记(三)
1.刪除文檔(remove()函數)
在執行remove()函數前先執行find()命令來判斷執行的條件是否正確,這是一個比較好的習慣。
語法:
db.collection.remove(<query>,<justOne> ) //2.6版本以后 db.collection.remove(<query>,{justOne: <boolean>,writeConcern: <document>} ) // 參數說明:// query :(可選)刪除的文檔的條件。 // justOne : (可選)如果設為 true 或 1,則只刪除一個文檔。 // writeConcern :(可選)拋出異常的級別。插入了同樣文檔兩次,移除?title 為 'MongoDB 教程'?文檔:
>db.col.remove({'title':'MongoDB 教程'}) WriteResult({ "nRemoved" : 2 }) # 刪除了兩條數據 >db.col.find() …… # 沒有數據 如果你只想刪除第一條找到的記錄可以設置 justOne 為 1,如下所示:>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1) 如果你想刪除所有數據,可以使用以下方式(類似常規 SQL 的 truncate 命令):>db.col.remove({}) //{}指刪除所有 >db.col.find() >注意:remove() 方法已經過時了,現在官方推薦使用 deleteOne() 和 deleteMany() 方法。
2. 查詢文檔(find())find() 方法以非結構化的方式來顯示所有文檔。
db.collection.find(query, projection) // query :可選,使用查詢操作符指定查詢條件 若不想指定查詢條件參數?query?可以 用?{}?代替,但是需要指定?projection?參數://querydb.collection.find({}, {title: 1}) // projection :可選,使用投影操作符指定返回的鍵。查詢時返回文檔中所有鍵值, 只需省略該參數即可(默認省略)。
指定 projection 格式如下,有兩種模式
//db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的鍵,不返回其他鍵 //db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的鍵,返回其他鍵
如果你需要以易讀的方式來讀取數據,可以使用 pretty() 方法
>db.col.find().pretty() pretty() 方法以格式化的方式來顯示所有文檔。除了 find() 方法之外,還有一個 findOne() 方法,它只返回一個文檔。
條件操作符:
- (>) 大于 - $gt
- (<) 小于 - $lt
- (>=) 大于等于 - $gte
- (<= ) 小于等于 - $lte
MongoDB 與 RDBMS Where 語句比較
如果你熟悉常規的 SQL 數據,通過下表可以更好的理解 MongoDB 的條件語句查詢:
| 等于 | {<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 |
MongoDB AND 條件
MongoDB 的 find() 方法可以傳入多個鍵(key),每個鍵(key)以逗號隔開,即常規 SQL 的 AND 條件。
>db.col.find({key1:value1, key2:value2}).pretty()MongoDB OR 條件
MongoDB OR 條件語句使用了關鍵字?$or,語法格式如下:
>db.col.find({$or: [{key1: value1}, {key2:value2}] } ).pretty()AND 和 OR 聯合使用
以下實例演示了 AND 和 OR 聯合使用,類似常規 SQL 語句為:?'where likes>50 AND (by = '菜鳥教程' OR title = 'MongoDB 教程')'
>db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鳥教程"},{"title": "MongoDB 教程"}]}).pretty() {"_id" : ObjectId("56063f17ade2f21f36b03133"),"title" : "MongoDB 教程","description" : "MongoDB 是一個 Nosql 數據庫","by" : "菜鳥教程","url" : "http://www.runoob.com","tags" : ["mongodb","database","NoSQL"],"likes" : 100 }2. $type操作符(條件操作符)
$type操作符是基于BSON類型來檢索集合中匹配的數據類型,并返回結果。
MongoDB 中可以使用的類型如下表所示:
| Double | 1 | ? |
| String | 2 | ? |
| Object | 3 | ? |
| Array | 4 | ? |
| Binary data | 5 | ? |
| Undefined | 6 | 已廢棄。 |
| Object id | 7 | ? |
| Boolean | 8 | ? |
| Date | 9 | ? |
| Null | 10 | ? |
| Regular Expression | 11 | ? |
| JavaScript | 13 | ? |
| Symbol | 14 | ? |
| JavaScript (with scope) | 15 | ? |
| 32-bit integer | 16 | ? |
| Timestamp | 17 | ? |
| 64-bit integer | 18 | ? |
| Min key | 255 | Query with?-1. |
| Max key | 127 | ? |
如果想獲取 "col" 集合中 title 為 String 的數據,你可以使用以下命令:
db.col.find({"title" : {$type : 2}}) 或 db.col.find({"title" : {$type : 'string'}})3.Limit 與 Skip方法
Limit():MongoDB中讀取指定數量的數據記錄,limit()方法接受一個數字參數,該參數指定從MongoDB中讀取的記錄條數。
>db.COLLECTION_NAME.find().limit(NUMBER)> db.col.find({},{"title":1,_id:0}).limit(2)
注:如果你們沒有指定limit()方法中的參數則顯示集合中的所有數據。
Skip():跳過指定數量的數據,skip方法同樣接受一個數字參數作為跳過的記錄條數。
>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)以下實例只會顯示第二條文檔數據
>db.col.find({},{"title":1,_id:0}).limit(1).skip(1) { "title" : "Java 教程" } >注:skip()方法默認參數為 0 。
當查詢時同時使用sort,skip,limit,無論位置先后,最先執行順序 sort再skip再limit。
3. sort() 排序
sort() 方法可以通過參數指定排序的字段,并使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而 -1 是用于降序排列。
>db.COLLECTION_NAME.find().sort({KEY:1}) //這里的KEY表示是按照這個鍵排序4. 索引? createIndex()方法
索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取數據時必須掃描集合中的每個文件并選取那些符合查詢條件的記錄。
這種掃描全集合的查詢效率是非常低的,特別在處理大量的數據時,查詢可以要花費幾十秒甚至幾分鐘,這對網站的性能是非常致命的。
索引是特殊的數據結構,索引存儲在一個易于遍歷讀取的數據集合中,索引是對數據庫表中一列或多列的值進行排序的一種結構。
>db.collection.createIndex(keys, options) 語法中 Key 值為你要創建的索引字段,1 為指定按升序創建索引,如果你想按降序來創建索引指定為 -1 即可。createIndex() 方法中你也可以設置使用多個字段創建索引(關系型數據庫中稱作復合索引)。
>db.col.createIndex({"title":1,"description":-1}) >createIndex() 接收可選參數,可選參數列表如下:
| background | Boolean | 建索引過程會阻塞其它數據庫操作,background可指定以后臺方式創建索引,即增加 "background" 可選參數。 "background" 默認值為false。 |
| unique | Boolean | 建立的索引是否唯一。指定為true創建唯一索引。默認值為false. |
| name | string | 索引的名稱。如果未指定,MongoDB的通過連接索引的字段名和排序順序生成一個索引名稱。 |
| dropDups | Boolean | 在建立唯一索引時是否刪除重復記錄,指定 true 創建唯一索引。默認值為?false. |
| sparse | Boolean | 對文檔中不存在的字段數據不啟用索引;這個參數需要特別注意,如果設置為true的話,在索引字段中不會查詢出不包含對應字段的文檔.。默認值為?false. |
| expireAfterSeconds | integer | 指定一個以秒為單位的數值,完成 TTL設定,設定集合的生存時間。 |
| v | index version | 索引的版本號。默認的索引版本取決于mongod創建索引時運行的版本。 |
| weights | document | 索引權重值,數值在 1 到 99,999 之間,表示該索引相對于其他索引字段的得分權重。 |
| default_language | string | 對于文本索引,該參數決定了停用詞及詞干和詞器的規則的列表。 默認為英語 |
| language_override | string | 對于文本索引,該參數指定了包含在文檔中的字段名,語言覆蓋默認的language,默認值為 language. |
5.聚合(aggregate()方法)主要用于處理數據(諸如統計平均值,求和等),并返回計算后的數據結果。有點類似sql語句中的 count(*)。
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION) > db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])//在上面的例子中,我們通過字段 by_user 字段對數據進行分組,并計算 by_user 字段相同值的總和。
下表展示了一些聚合的表達式:
| $sum | 計算總和。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
| $avg | 計算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
| $min | 獲取集合中所有文檔對應值得最小值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
| $max | 獲取集合中所有文檔對應值得最大值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
| $push | 在結果文檔中插入值到一個數組中。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
| $addToSet | 在結果文檔中插入值到一個數組中,但不創建副本。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
| $first | 根據資源文檔的排序獲取第一個文檔數據。 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
| $last | 根據資源文檔的排序獲取最后一個文檔數據 | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
?管道:
管道在Unix和Linux中一般用于將當前命令的輸出結果作為下一個命令的參數。
MongoDB的聚合管道將MongoDB文檔在一個管道處理完畢后將結果傳遞給下一個管道處理。管道操作是可以重復的。
表達式:處理輸入文檔并輸出。表達式是無狀態的,只能用于計算當前聚合管道的文檔,不能處理其它的文檔。
這里我們介紹一下聚合框架中常用的幾個操作:
- $project:修改輸入文檔的結構。可以用來重命名、增加或刪除域,也可以用于創建計算結果以及嵌套文檔。
- $match:用于過濾數據,只輸出符合條件的文檔。$match使用MongoDB的標準查詢操作。
- $limit:用來限制MongoDB聚合管道返回的文檔數。
- $skip:在聚合管道中跳過指定數量的文檔,并返回余下的文檔。
- $unwind:將文檔中的某一個數組類型字段拆分成多條,每條包含數組中的一個值。
- $group:將集合中的文檔分組,可用于統計結果。
- $sort:將輸入文檔排序后輸出。
- $geoNear:輸出接近某一地理位置的有序文檔。
?6. 復制
MongoDB復制是將數據同步在多個服務器的過程。
復制提供了數據的冗余備份,并在多個服務器上存儲數據副本,提高了數據的可用性, 并可以保證數據的安全性。
復制還允許您從硬件故障和服務中斷中恢復數據。
MongoDB復制原理
mongodb的復制至少需要兩個節點。其中一個是主節點,負責處理客戶端請求,其余的都是從節點,負責復制主節點上的數據。
mongodb各個節點常見的搭配方式為:一主一從、一主多從。
主節點記錄在其上的所有操作oplog,從節點定期輪詢主節點獲取這些操作,然后對自己的數據副本執行這些操作,從而保證從節點的數據與主節點一致。
副本集特征:
- N 個節點的集群
- 任何節點可作為主節點
- 所有寫入操作都在主節點上
- 自動故障轉移
- 自動恢復
MongoDB副本集設置
在本教程中我們使用同一個MongoDB來做MongoDB主從的實驗, 操作步驟如下:
1、關閉正在運行的MongoDB服務器。
現在我們通過指定 --replSet 選項來啟動mongoDB。--replSet 基本語法格式如下:
mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"實例
mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0以上實例會啟動一個名為rs0的MongoDB實例,其端口號為27017。
啟動后打開命令提示框并連接上mongoDB服務。
在Mongo客戶端使用命令rs.initiate()來啟動一個新的副本集。
我們可以使用rs.conf()來查看副本集的配置
查看副本集狀態使用 rs.status() 命令
副本集添加成員
添加副本集的成員,我們需要使用多臺服務器來啟動mongo服務。進入Mongo客戶端,并使用rs.add()方法來添加副本集的成員。
語法
rs.add() 命令基本語法格式如下:
>rs.add(HOST_NAME:PORT)實例
假設你已經啟動了一個名為mongod1.net,端口號為27017的Mongo服務。 在客戶端命令窗口使用rs.add() 命令將其添加到副本集中,命令如下所示:
>rs.add("mongod1.net:27017") >MongoDB中你只能通過主節點將Mongo服務添加到副本集中, 判斷當前運行的Mongo服務是否為主節點可以使用命令db.isMaster() 。
MongoDB的副本集與我們常見的主從有所不同,主從在主機宕機后所有服務將停止,而副本集在主機宕機后,副本會接管主節點成為主節點,不會出現宕機的情況。
7. 分片
在Mongodb里面存在另一種集群,就是分片技術,可以滿足MongoDB數據量大量增長的需求。
當MongoDB存儲海量的數據時,一臺機器可能不足以存儲數據,也可能不足以提供可接受的讀寫吞吐量。這時,我們就可以通過在多臺機器上分割數據,使得數據庫系統能存儲和處理更多的數據。
為什么使用分片
- 復制所有的寫入操作到主節點
- 延遲的敏感數據會在主節點查詢
- 單個副本集限制在12個節點
- 當請求量巨大時會出現內存不足。
- 本地磁盤不足
- 垂直擴展價格昂貴
上圖中主要有如下所述三個主要組件:
- Shard:
用于存儲實際的數據塊,實際生產環境中一個shard server角色可由幾臺機器組個一個replica set承擔,防止主機單點故障
- Config Server:
mongod實例,存儲了整個 ClusterMetadata,其中包括 chunk信息。
- Query Routers:
前端路由,客戶端由此接入,且讓整個集群看上去像單一數據庫,前端應用可以透明使用。
使用配置:http://www.runoob.com/mongodb/mongodb-sharding.html
8.備份mongodump與恢復mongorestore
>mongodump -h dbhost -d dbname -o dbdirectory -h: MongDB所在服務器地址,例如:127.0.0.1,當然也可以指定端口號:127.0.0.1:27017-d: 需要備份的數據庫實例,例如:test-o: 備份的數據存放位置,例如:c:\data\dump,當然該目錄需要提前建立,在備份完成后,系統自動在dump目錄下建立一個test目錄,這個目錄里面存放該數據庫實例的備份數據。 >mongorestore -h <hostname><:port> -d dbname <path> --host <:port>, -h <:port>: MongoDB所在服務器地址,默認為: localhost:27017--db , -d : 需要恢復的數據庫實例,例如:test,當然這個名稱也可以和備份時候的不一樣,比如test2--drop: 恢復的時候,先刪除當前數據,然后恢復備份的數據。就是說,恢復后,備份后添加修改的數據都會被刪除,慎用哦!<path>: mongorestore 最后的一個參數,設置備份數據所在位置,例如:c:\data\dump\test。你不能同時指定 <path> 和 --dir 選項,--dir也可以設置備份目錄。--dir: 指定備份的目錄你不能同時指定 <path> 和 --dir 選項。MongoDB中提供了mongostat 和 mongotop 兩個命令來監控MongoDB的運行情況
?
轉載于:https://www.cnblogs.com/aimeeblogs/p/9512368.html
總結
以上是生活随笔為你收集整理的mongodb笔记(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 远程访问ubuntu下mysql的问题
- 下一篇: 2018 Multi-Universit