ubuntu 命令行向mongodb導入json數據


 

准備

在學習本教程之前,請確保完成以下先決條件:

  • Ubuntu 14.04 騰訊雲CVM
  • 一台已經設置好可以使用sudo命令的非root賬號的Ubuntu服務器,並且已開啟防火牆。沒有服務器的同學可以在這里購買,不過我個人更推薦您使用免費的騰訊雲開發者實驗室進行試驗,學會安裝后再購買服務器
  • 在Ubuntu 14.04上安裝和配置MongoDB

除非另有說明,否則本教程中需要root權限的所有命令都應作為具有sudo權限的非root用戶運行。

了解基礎知識

在繼續本文之前,需要對此問題有一些基本的了解。如果您有使用MySQL等流行的關系數據庫系統的經驗,那么在使用MongoDB時可能會發現一些相似之處。

您應該知道的第一件事是MongoDB使用json和bson(二進制json)格式來存儲其信息。Json是人類可讀的格式,非常適合導出並最終導入數據。您可以使用任何支持json的工具進一步管理導出的數據,包括簡單的文本編輯器。

一個示例json文檔如下所示:

{"address":[
    {"building":"1007", "street":"Park Ave"},
    {"building":"1008", "street":"New Ave"},
]}

Json使用非常方便,但它不支持bson中可用的所有數據類型。這意味着如果使用json,將會出現所謂的“保真度丟失”。這就是備份/恢復的原因,最好使用能夠更好地恢復MongoDB數據庫的二進制bson。

其次,您不必擔心顯式創建MongoDB數據庫。如果您指定用於導入的數據庫尚不存在,則會自動創建該數據庫。集合'(數據庫表)結構的情況更好。與其他數據庫引擎相比,在MongoDB中,再次在第一個文檔(數據庫行)插入時自動創建結構。

第三,在MongoDB中讀取或插入大量數據(例如本文的任務)可能會占用大量資源並占用大量CPU,內存和磁盤空間。考慮到MongoDB經常用於大型數據庫和大數據,這是至關重要的。解決此問題的最簡單方法是在夜間運行導出/備份。

第四,如果您有一個繁忙的MongoDB服務器,其信息在數據庫導出過程中發生變化,則信息一致性可能會有問題。這個問題沒有簡單的解決方案,但在本文的最后,您將看到有關進一步閱讀有關復制的建議。

將信息導入MongoDB

要了解如何將信息導入MongoDB,我們可以使用一個關於餐館的流行示例MongoDB數據庫。它是.json格式,可以使用wget以下方式下載:

wget https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json

下載完成后,您應該在當前目錄中有一個名為primer-dataset.json(12 MB大小)的文件。讓我們將這個文件中的數據導入一個名為newdb的新數據庫,並進入一個名為restaurants的集合。對於導入,我們將使用如下命令mongoimport

sudo mongoimport --db newdb --collection restaurants --file primer-dataset.json
mongoimport -d expedia -c hotel_info --file 文件名.json

-d 指哪個database
-c 哪個table/collection

結果應如下所示:

2016-01-17T14:27:04.806-0500    connected to: localhost
2016-01-17T14:27:07.315-0500    imported 25359 documents

如上面的命令所示,已導入25359個文檔。因為我們沒有調用newdb數據庫,所以MongoDB會自動創建它。

讓我們通過連接到這樣調用的新創建的名為newdb的MongoDB數據庫來驗證導入:

sudo mongo newdb

您現在已連接到新創建的newdb數據庫實例。請注意,您的提示已更改,表明您已連接到數據庫。

使用以下命令計算restaurants集合中的文檔:

db.restaurants.count()

結果應該顯示25359,正好是導入文檔的數量。為了更好的檢查,您可以從餐館集合中選擇第一個文檔,如下所示:

db.restaurants.findOne() 

結果應如下所示:

{
        "_id" : ObjectId("569beb098106480d3ed99926"),
        "address" : {
                "building" : "1007",
                "coord" : [
                        -73.856077,
                        40.848447
                ],
                "street" : "Morris Park Ave",
                "zipcode" : "10462"
        },
        "borough" : "Bronx",
        "cuisine" : "Bakery",
        "grades" : [
                {
                        "date" : ISODate("2014-03-03T00:00:00Z"),
                        "grade" : "A",
                        "score" : 2
                },
...
        ],
        "name" : "Morris Park Bake Shop",
        "restaurant_id" : "30075445"
}

這樣詳細的檢查可以揭示文檔的問題,例如它們的內容,編碼等.json格式使用UTF-8編碼,您的導出和導入應該在該編碼中。如果您手動編輯json文件,請記住這一點。否則,MongoDB會自動為您處理。

要退出MongoDB提示,請在提示符處鍵入exit

exit

您將以非root用戶身份返回到正常的命令行提示符。

從MongoDB導出信息

正如我們之前提到的,通過導出MongoDB信息,您可以獲取包含數據的人類可讀文本文件。默認情況下,信息以json格式導出,但您也可以導出到csv(逗號分隔值)。

要從MongoDB導出信息,請使用該命令mongoexport。它允許您導出非常精細的導出,以便您可以指定數據庫,集合,字段,甚至可以使用查詢進行導出。

一個簡單的mongoexport例子是從我們之前導入的newdb數據庫中導出餐館集合。它可以這樣做:

sudo mongoexport --db newdb -c restaurants --out newdbexport.json

在上面的命令中,我們用--db來指定數據庫,-c集合以及--out文件里的數據將被保存。

成功的輸出mongoexport應如下所示:

2016-01-20T03:39:00.143-0500    connected to: localhost
2016-01-20T03:39:03.145-0500    exported 25359 records

上面的輸出顯示已導入25359個文檔 - 與導入的文檔數相同。

在某些情況下,您可能只需要導出集合的一部分。考慮到餐館json文件的結構和內容,讓我們出口所有符合標准的餐廳,位於布朗克斯區,並有中國菜。如果我們想在連接到MongoDB時直接獲取此信息,請再次連接到數據庫:

sudo mongo newdb

然后,使用此查詢:

db.restaurants.find( { borough: "Bronx", cuisine: "Chinese" } )

結果顯示在終端上。要退出MongoDB提示,請exit在提示符處鍵入:

exit

如果要從sudo命令行而不是在連接到數據庫時導出數據,請mongoexport通過為-q參數指定前面的查詢部分,如下所示:

導出數據命令(導出的文件有兩種格式:json/csv,此處導出的是json文件,對於導出CSV文件是需要額外指定一個變量 -field ‘對於的字段名稱’):

mongoexport -h 數據庫所在主機地址(若是本地則為127.0.0.1,若是遠程則寫為遠程地址IP)-d 要導     出的數據庫名稱 -c 集合名稱 -o 輸出多的json文件路徑

導出csv文件示例 :mongoexport -h 主機地址 -d 數據庫名稱 -c 集合名稱 --csv --field 字段列表 -o 輸出地址

實際示例:mongoexport -h 127.0.0.1 -d test_new -c mycolle -o D:\Database\temp\mycolle.json

 

如果導出成功,結果應如下所示:

2016-01-20T04:16:28.381-0500    connected to: localhost
2016-01-20T04:16:28.461-0500    exported 323 records

以上顯示已導出323條記錄,您可以在我們指定的Bronx_Chinese_retaurants.json文件中找到它們。

結論

本文向您介紹了從MongoDB數據庫導入和導出信息的基本要素。

復制不僅對可伸縮性有用,而且對當前主題也很重要。復制允許您在從故障恢復主服務器時從MongoDB服務器中不間斷地繼續運行MongoDB服務。復制的一部分也是操作日志(oplog),它記錄了修改數據的所有操作。就像在MySQL中使用二進制日志一樣,您可以使用此日志在上次備份完成后恢復數據。回想一下,備份通常在夜間進行,如果您決定在晚上恢復備份,則會丟失自上次備份以來的所有更新。

更多Ubuntu教程請前往騰訊雲+社區學習更多知識。

參考文獻:《How To Import and Export a MongoDB Database on Ubuntu 14.04》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM