每篇半小時1天入門MongoDB——3.MongoDB可視化及shell詳解

来源:http://www.cnblogs.com/jiekzou/archive/2017/06/12/6977838.html
-Advertisement-
Play Games

本篇主要介紹MongoDB可視化操作以及shell使用及命令。 MongoVUE安裝和簡單使用 使用mongo.exe 管理資料庫雖然可行,功能也挺強大,但每次都要敲命令,即繁瑣枯燥而且效率低下。MongoDb在Windows下的可視化操作的管理工具非常多,筆者從中找了幾款使用了一翻,最後挑了一款M ...


本篇主要介紹MongoDB可視化操作以及shell使用及命令。

MongoVUE安裝和簡單使用

使用mongo.exe 管理資料庫雖然可行,功能也挺強大,但每次都要敲命令,即繁瑣枯燥而且效率低下。MongoDb在Windows下的可視化操作的管理工具非常多,筆者從中找了幾款使用了一翻,最後挑了一款MongoVUE來最簡單介紹,因為筆者覺得MongoVUE界面看上去舒服些。

下載地址:http://www.mongovue.com/downloads/

註意:官方提供的是收費版,試用期15天。但是天朝的東西,你懂的,破解很容易。

運行效果如下圖所示。

 

添加資料庫連接之前,要先運行Mongo服務,然後添加Mongo資料庫連接,如下圖所示。

Document數據插入

> show collections
persons
system.indexes
> db.persons.find()
{ "_id" : ObjectId("593959250ab68d9cc7011a93"), "name" : "玉傑" }
{ "_id" : ObjectId("59395c350ab68d9cc7011a94"), "name" : "楚留香" }

1.插入文檔

db.[documentName].insert({})

2.批量插入文檔

  • shell這樣執行是錯誤的:db.[documentName].insert([{},{},...])
  • shell不支持批量插入
  • 想完成批量插入可以使用Mongo的應用驅動或者是shell的for迴圈
> for(var i=0;i<10;i++){
... db.persons.insert({name:'test'+i})}
WriteResult({ "nInserted" : 1 })
> db.persons.find()
{ "_id" : ObjectId("593959250ab68d9cc7011a93"), "name" : "玉傑" }
{ "_id" : ObjectId("59395c350ab68d9cc7011a94"), "name" : "楚留香" }
{ "_id" : ObjectId("593b489e29b0f45384dfaafa"), "name" : "test0" }
{ "_id" : ObjectId("593b489e29b0f45384dfaafb"), "name" : "test1" }
{ "_id" : ObjectId("593b489e29b0f45384dfaafc"), "name" : "test2" }
{ "_id" : ObjectId("593b489e29b0f45384dfaafd"), "name" : "test3" }
{ "_id" : ObjectId("593b489e29b0f45384dfaafe"), "name" : "test4" }
{ "_id" : ObjectId("593b489e29b0f45384dfaaff"), "name" : "test5" }
{ "_id" : ObjectId("593b489e29b0f45384dfab00"), "name" : "test6" }
{ "_id" : ObjectId("593b489e29b0f45384dfab01"), "name" : "test7" }
{ "_id" : ObjectId("593b489e29b0f45384dfab02"), "name" : "test8" }
{ "_id" : ObjectId("593b489e29b0f45384dfab03"), "name" : "test9" }
>

3.Save操作

save操作和insert操作的區別在於當遇到_id相同的情況下,save完成保存操作,而insert則會報錯

我們先來看下insert操作,先插入一條01的記錄,然後再插入一條_id為01的記錄會報錯,因為_id重覆了。

> db.persons.insert({_id:"01",name:1})
WriteResult({ "nInserted" : 1 })
> db.persons.insert({_id:"01",name:2})
WriteResult({
        "nInserted" : 0,
        "writeError" : {
                "code" : 11000,
                "errmsg" : "E11000 duplicate key error index: myTest.persons.$_id_ dup key: { : \"01\" }"
        }
})
>

再來看下save操作,直接將_id為01的記錄更新了,name由1更新為了2

> db.persons.save({_id:"01",name:2})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : ObjectId("593959250ab68d9cc7011a93"), "name" : "玉傑" }
{ "_id" : ObjectId("59395c350ab68d9cc7011a94"), "name" : "楚留香" }
{ "_id" : ObjectId("593b489e29b0f45384dfaafa"), "name" : "test0" }
{ "_id" : ObjectId("593b489e29b0f45384dfaafb"), "name" : "test1" }
{ "_id" : ObjectId("593b489e29b0f45384dfaafc"), "name" : "test2" }
{ "_id" : ObjectId("593b489e29b0f45384dfaafd"), "name" : "test3" }
{ "_id" : ObjectId("593b489e29b0f45384dfaafe"), "name" : "test4" }
{ "_id" : ObjectId("593b489e29b0f45384dfaaff"), "name" : "test5" }
{ "_id" : ObjectId("593b489e29b0f45384dfab00"), "name" : "test6" }
{ "_id" : ObjectId("593b489e29b0f45384dfab01"), "name" : "test7" }
{ "_id" : ObjectId("593b489e29b0f45384dfab02"), "name" : "test8" }
{ "_id" : ObjectId("593b489e29b0f45384dfab03"), "name" : "test9" }
{ "_id" : "01", "name" : 2 }
>

Document數據刪除

1.刪除列表中所有數據

db.[documentName].remove()
集合的本身和索引不會被刪除。刪除文檔是永久性的,不能撤銷,也不能恢復的。因此,在執行remove()函數前先用find()命令來查看下是否正確,是個比較好的習慣啦。

> db.persons.remove({})
WriteResult({ "nRemoved" : 13 })
> db.persons.find()
> show collections
persons
system.indexes
> db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "myTest.persons" }
>

2.根據條件刪除

刪除集合persons中name等於yujie的記錄

remove()函數可以接受一個查詢文檔作為可選參數來有選擇性的刪除符合條件的文檔

先來插入幾條測試記錄

> db.persons.insert({name:"yujie"})
WriteResult({ "nInserted" : 1 })
> db.persons.insert({name:"zouqj"})
WriteResult({ "nInserted" : 1 })
> db.persons.find()
{ "_id" : ObjectId("593b4c5329b0f45384dfab04"), "name" : "yujie" }
{ "_id" : ObjectId("593b4c5e29b0f45384dfab05"), "name" : "zouqj" }
>

再來刪除name等於yujie的記錄

> db.persons.remove({name:"yujie"})
WriteResult({ "nRemoved" : 1 })
> db.persons.find()
{ "_id" : ObjectId("593b4c5e29b0f45384dfab05"), "name" : "zouqj" }
>

3.小技巧

如果你想清除一個數據量十分龐大的集合,直接刪除該集合併且重新建立索引的辦法比直接remove的效率要高很多。

Document數據更新

db.[documentName].update(參數1,參數2,[參數3],[參數4])

  • 參數1:查詢的條件
  • 參數2:更新的欄位
  • 參數3:如果不存在則插入
  • 參數4:是否允許修改多條記錄

1.強硬的文檔替換式更新操作

db.[documentName].update({查詢器},{修改器})

> db.persons.insert({name:"yujie",age:29})
WriteResult({ "nInserted" : 1 })
> db.persons.find()
{ "_id" : ObjectId("593b4c5e29b0f45384dfab05"), "name" : "zouqj" }
{ "_id" : ObjectId("593b540529b0f45384dfab06"), "name" : "yujie", "age" : 29 }
> db.persons.update({name:"yujie"},{age:30})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : ObjectId("593b4c5e29b0f45384dfab05"), "name" : "zouqj" }
{ "_id" : ObjectId("593b540529b0f45384dfab06"), "age" : 30 }
>

原本我是想把name等於yujie的記錄,將其age更新為30,可是會發現雖然age更新為30了,但是也把"name" : "yujie"直接給刪除了。因為:強硬的更新會用新的文檔替代老的文檔,其實就相當於先刪除再插入的操作。

2.主鍵衝突的時候會報錯並且停止更新操作

因為是強硬替換,當替換的文檔和已有的文檔ID衝突的時候,系統會報錯。

先來插入幾條測試記錄

> db.persons.insert({_id:1,name:"test1"})
WriteResult({ "nInserted" : 1 })
> db.persons.insert({_id:2,name:"test2"})
WriteResult({ "nInserted" : 1 })
> db.persons.find()
{ "_id" : ObjectId("593b4c5e29b0f45384dfab05"), "name" : "zouqj" }
{ "_id" : ObjectId("593b540529b0f45384dfab06"), "age" : 30 }
{ "_id" : 1, "name" : "test1" }
{ "_id" : 2, "name" : "test2" }
>

然後我們再來強硬更新,會發現報錯了。

> db.personso.update({_id:1},{_id:2,name:"test2"})
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
> db.persons.update({_id:1},{_id:2,name:"test2"})
WriteResult({
        "nMatched" : 0,
        "nUpserted" : 0,
        "nModified" : 0,
        "writeError" : {
                "code" : 16837,
                "errmsg" : "The _id field cannot be changed from {_id: 1.0} to {_id: 2.0}."
        }
})
>

3.insertOrUpdate操作

db.[documentName].update({查詢器},{修改器},true)

目的:查詢器查出來數據就執行更新操作,查不出來就替換操作。

> db.persons.update({_id:3},{_id:3,name:"test3"},true)
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 3 })
> db.persons.find()
{ "_id" : ObjectId("593b4c5e29b0f45384dfab05"), "name" : "zouqj" }
{ "_id" : ObjectId("593b540529b0f45384dfab06"), "age" : 30 }
{ "_id" : 1, "name" : "test1" }
{ "_id" : 2, "name" : "test2" }
{ "_id" : 3, "name" : "test3" }
>

4.批量更新操作

預設情況下,當查詢器查詢出多條數據的時候預設就修改第一條數據,如何實現批量修改:
db.[documentName].update({查詢器},{修改器},false,true)

5.修改器【通過修改器來完成局部更新操作】

修改器名稱語法說明示例
$set {$set:{field:value}} 用於指定一個鍵值對,存在就修改,不存在就添加 {$set:{name:”Leon”}}
$inc {$inc:{field:value}} 只適用於數字類型的欄位值修改,對指定欄位進行增減指定數值 {$inc:{age:1}}
$unset {$unset:{field:1}} 刪除指定的欄位 {$unset:{age:1}}
$push {$push:{field:value}} 指定的欄位必須是數組,否則中斷,指定的欄位不存在則創建 {$push:{family:”brother”}}
$pushAll {$pushAll:{field:array}} 要求同push,一次添加多個元素到數組 {$pushAll:{family:[“father”,”mother”,”brother”]}}
$addToSet {$addToSet:{field:value}} 將值插入匹配元素指定的數組中,如果該值已存在則不添加 {$addToSet:{family:”sister”}
$pop {$pop:{field:value}} 從指定欄位中數組中刪除一個值,value接受正數(最後一個)和負數(第一個),一般使用1和-1 {$pop:{family:1}}
$pull $pull:{field:value} 從指定欄位中的數組中刪除指定的一個值 {$pull:{family:”father”}}
$pullAll {$pullAll:{field:array}} 從指定欄位中的數組中刪除指定的所有值 {$pullAll:{family:[“father”,”mother”]}}
$ 這是一個定位器非修改器,用於定位數組中的指定鍵  

6.$addToSet與$each結合完成批量數組更新

db.persons.update({_id:1},{$addToSet:{books:{$each:{"js","db"]}}})
$each會迴圈後面的數組把每一個數值進行$addToSet操作

7.存在分配與查詢效率

當document被創建的時候DB為其分配記憶體和預留記憶體,當修改操作不超過預留記憶體的時候,則速度
非常快,反之,若超過了就要分配新的記憶體,從而消耗時間。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SQL SERVER的表結構及索引轉換為MySQL的表結構及索引,其實在很多第三方工具中有提供,比如navicat、sqlyog等,但是,在處理某些數據類型、預設值及索引轉換的時候,總有些不盡人意並且需要安裝軟體,懶人開始想法子,所以基於SQL SERVER,寫了一個存儲過程,可以根據表名直接轉換為 ...
  • 之前一直有在關註微軟認證的一些消息,由於最新的SQL Server認證加入了2016的相關內容,導致課程資料需要大部分更新,但是微軟更新相對比較慢,並且經常改版,目前發現的最新的MCP Cert Path為2017年5月22日版。所以需要不定時翻閱相關站點查看最新情況,這裡把目前最新的情況述說一下, ...
  • 目錄 一、索引 二、索引類型 三、索引種類 四、操作索引 五、創建索引的時機 六、命中索引 七、其它註意事項 八、LIMIT分頁 九、執行計劃 十、慢查詢日誌 一、索引 MySQL索引的建立對於MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度。 打個比方,如果合理的設計且使用索引 ...
  • [20170611]關於數據塊地址的計算.txt--//如果資料庫出現一些問題,會在alert或者跟蹤文件,或者屏幕出現一些錯誤提示.例如:ORA-00600: internal error code, arguments: [2662], [3], [392066208], [3], [39206 ...
  • 1.什麼是資料庫? 俗稱數據的倉庫,方便管理數據的軟體(或程式) 2.MySQL入門 1.官網下載 2.安裝MySql 直接雙擊安裝即可,但註意安裝的目錄不可出現中文。 2.1驗證安裝是否成功 打開命令行-->輸入 "mysql -u root -p" 回車,輸入密碼-->回車 出現以下內容,即為成 ...
  • 介紹 物理故障、操作系統故障或 SQL Server 故障都可能導致兩個可用性副本之間的會話失敗。 可用性副本不會定期檢查 Sqlservr.exe 所依賴的組件來驗證這些組件是在正常運行還是已出現故障。 但對於某些類型的故障,受影響的組件將向 Sqlservr.exe 報告錯誤。 由另一個組件報告 ...
  • MariaDB資料庫管理系統是MySQL的一個分支,主要由開源社區在維護,採用GPL授權許可 MariaDB的目的是完全相容MySQL,包括API和命令行,使之能輕鬆成為MySQL的代替品。在存儲引擎方面,使用XtraDB(英語:XtraDB)來代替MySQL的InnoDB。 MariaDB由MyS ...
  • MySQL中lock tables和unlock tables淺析 在MySQL中提供了鎖定表(lock tables)和解鎖表(unlock tables)的語法功能,ORACLE與SQL Server資料庫當中沒有這種語法。相信剛接觸MySQL的人,都想詳細、深入的瞭解一下這個功能.下麵就儘量全... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...