2013-01-23 142 views
51

我正在爲32位Windows7機器使用MongoDB 2.2.2。我在.js文件中有一個複雜的聚合查詢。我需要在shell上執行此文件並將輸出指向CSV文件。我確保查詢返回一個「扁平」json(沒有嵌套鍵),所以它本質上可以轉換爲整齊的csv。我知道load()eval()eval()需要我將整個查詢粘貼到shell中,並且只允許在腳本中使用printjson(),而我需要csv。第二種方式:load() ..它將輸出顯示在屏幕上,並再次以json格式顯示。

有沒有一種方法可以做Mongo從json到csv的這種轉換? (我需要csv文件來準備數據圖表)。我在想:

1. mongo有一個內置的命令,我現在找不到。
2.蒙戈不能爲我做;我最多可以將json輸出發送到一個文件,然後我需要將它自己轉換爲csv。
3. Mongo可以將json輸出發送到一個臨時集合,其中的內容可以很容易地以mongoexported轉換爲csv格式。但我認爲只有map-reduce查詢支持輸出集合。是對的嗎?我需要它來進行聚合查詢。將mongo查詢的輸出重定向到csv文件

感謝所有幫助:)

+1

如果這事你頻繁,你可能會考慮寫使用.NET一個獨立的EXE我們已要求,python,或者你可以使用NodeJs;每個都有一個本地驅動程序,可以很容易地執行代碼並生成所需的輸出。 – WiredPrairie

+0

我指的是Zachary的答案http://stackoverflow.com/questions/4130849/convert-json-format-to-csv-format-for-ms-excel,我可以從json轉換爲csv。但作爲一種選擇,我可以輸出json到一個集合,然後做一個mongoexport? –

+0

我建議你只需使用Node和NodeJS的MongoDB驅動程序構建一個小線束,然後就可以執行任何你想要的代碼。你會很快得到你想要的結果,而不需要shell。這將是非常可維護的(和可調試的)。 – WiredPrairie

回答

114

我知道這個問題是舊的,但我花了一個小時試圖導出一個複雜的查詢到CSV,我想分享我的想法。首先,我無法獲得任何json到csv轉換器的工作(儘管this看起來很有前途)。我最終做的是在我的mongo腳本中手動編寫csv文件。

這是一個簡單的版本,但基本上就是我所做的:

print("name,id,email"); 
db.User.find().forEach(function(user){ 
    print(user.name+","+user._id.valueOf()+","+user.email); 
}); 

這我只是管道查詢到stdout

mongo test export.js > out.csv 

其中test是我使用的數據庫的名稱。

+0

我該如何指定User集合所在的數據庫? – Nelu

+2

@NeluMalancea檢查了MongoDB [文檔](http://docs.mongodb.org/manual/tutorial/getting-started-with-the-mongo-shell/)他們有這個信息。您可以通過在腳本的頂部添加'use '來指定數據庫。 – GEverding

+2

實際上,因爲諸如「使用」這樣的shell助手不是javascript,所以它們是不允許的。請參閱http://docs.mongodb.org/manual/tutorial/write-scripts-for-the-mongo-shell/。相反,開始你的腳本是這樣的:conn = new Mongo(); db = conn.getDB('your_db_name'); –

5

看一看 this

從蒙戈外殼outputing到文件。 不支持從mongos shell輸出csv。您必須自己編寫javascript或使用可用的衆多轉換器之一。例如,Google「將json轉換爲csv」。

5

這裏是你可以嘗試什麼:

print("id,name,startDate") 
cursor = db.<collection_name>.find(); 
while (cursor.hasNext()) { 
    jsonObject = cursor.next(); 
    print(jsonObject._id.valueOf() + "," + jsonObject.name + ",\"" + jsonObject.stateDate.toUTCString() +"\"") 

} 

保存在一個文件,說 「export.js」。運行以下命令:

mongo <host>/<dbname> -u <username> -p <password> export.js > out.csv 
49

蒙戈的內置出口工作正常,除非你要像格式化日期,隱祕數據類型等

下面的命令作品魅力的任何數據操作。

mongoexport -h localhost -d databse -c collection --csv 
--fields erpNum,orderId,time,status 
-q '{"time":{"$gt":1438275600000}, "status":{"$ne" :"Cancelled"}}' 
--out report.csv 
+0

真棒! –

+8

謝謝!提示:現在它是'--type = csv'而不是'--csv'。 – Jan

0

擴展其他答案:

我發現@ GEverding的回答最靈活的。它還可以與聚集:

test_db.js

print("name,email"); 

db.users.aggregate([ 
    { $match: {} } 
]).forEach(function(user) { 
     print(user.name+","+user.email); 
    } 
}); 

執行以下命令導出結果:

mongo test_db <./test_db.js>> ./test_db.csv 

不幸的是,它增加了額外的文本需要處理CSV文件之前我們可以使用該文件:

MongoDB shell version: 3.2.10 
connecting to: test_db 

但我們可以蒙戈外殼停止隨地吐痰這些評論並只打印通過將--quiet標誌

mongo --quiet test_db <./test_db.js>> ./test_db.csv