mongoクエリの出力をcsvファイルにリダイレクトします


88

32ビットWindows7マシンにMongoDB2.2.2を使用しています。.jsファイルに複雑な集計クエリがあります。このファイルをシェルで実行し、出力をCSVファイルに送る必要があります。クエリが「フラットな」json(ネストされたキーなし)を返すようにするので、本質的にきちんとしたcsvに変換できます。

私が知っているload()eval()eval()クエリ全体をシェルに貼り付ける必要がありprintjson()、スクリプト内でのみ許可されますが、csvが必要です。そして、2番目の方法:load()..出力を画面に出力し、再びjson形式で出力します。

Mongoがjsonからcsvへのこの変換を行う方法はありますか?(データのグラフを作成するには、csvファイルが必要です)。私は考えています:

1。どちらのmongoにも、今は見つけることができないこのための組み込みコマンドがあります。
2.モンゴは私のためにそれをすることはできません。私はせいぜいjson出力をファイルに送信することができ、それを自分でcsvに変換する必要があります。
3. Mongoは、json出力を一時コレクションに送信できます。その内容は簡単mongoexportedにcsv形式にすることができます。しかし、出力コレクションをサポートしているのはmap-reduceクエリだけだと思います。そうですか?集計クエリに必要です。

助けてくれてありがとう:)


1
これが頻繁に行うことである場合は、.NET、pythonを使用してスタンドアロンEXEを作成することを検討するか、NodeJを使用することができます。それぞれにネイティブドライバーがあり、コードを簡単に実行して目的の出力を生成できます。
WiredPrairie 2013年

私はstackoverflow.com/questions/4130849/でZacharyの回答を参照しています…そして、jsonからcsvに変換することができます。しかし、別の方法として、jsonをコレクションに出力してからmongoexportを実行できますか?
Aafreen Sheikh 2013

NodeとNodeJS用のMongoDBドライバーを使用して小さなハーネスを作成することをお勧めします。そうすれば、好きなコードを実行できます。シェルをまったく必要とせずに、必要な結果を非常に迅速に得ることができます。それは非常に保守可能(そしてデバッグ可能)です。
WiredPrairie 2013年

回答:


179

この質問は古いことは知っていますが、複雑なクエリをcsvにエクスポートするのに1時間費やし、自分の考えを共有したいと思いました。最初に、jsonからcsvへのコンバーターを機能させることができませんでした(これは有望に見えましたが)。私がやったことは、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で、私が使用するデータベースの名前はです。


ユーザーコレクションがどのデータベースにあるかをどのように指定しますか?
Nelu 2013年

2
@NeluMalanceaは、この情報を持っているMongoDBドキュメントをチェックしてください。use <database>スクリプトの先頭に追加することでDBを指定できます
GEverding 2013年

2
実際、「use <database>」などのシェルヘルパーはJavaScriptではないため、許可されていません。docs.mongodb.org/manual/tutorial/…を参照してください。代わりに、次のようにスクリプトを開始します。conn= new Mongo(); db = conn.getDB( 'your_db_name');
Steve Hansen Smythe 2015

2
@NeluMalanceamongoコマンドはdburl(およびuser、pass、…)を
受け入れ

3
@NeluMalanceatest最後のコマンドであるデータベースの名前、ちょうどあなたのデータベースの名前で置き換えます。
ゾルタン2016年

116

日付のフォーマット、秘密のデータ型などのデータ操作が必要な場合を除いて、Mongoの組み込みエクスポートは正常に機能しています。

次のコマンドは魅力として機能します。

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

17
トンありがとう!ヒント:現在はの--type=csv代わりになってい--csvます。
1

mongoexportの制限は、フィールドを操作できないことです。mongo IDはObjectId(mongidstring)としてエクスポートされます。誰かがフィールドのデータを操作したい場合(たとえば、ObjectId(mongidstring).toString())、mongoシェルスクリプトから結果をエクスポートできる方が優れています。
raj006 2018

1
集計操作はできますか?
ヘンディイラワン

このソリューションは機能しました。しかし、Windowsの場合、2つの修正を行う必要がありました。外部からの二重アポストロフィと内部の単一のアポストロフィが必要でした。
nurb20年

10

他の答えを拡張する:

@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

しかし、mongoシェルにそれらのコメントの吐き出しを止めさせ、--quietフラグを渡すことによって要求したものだけを印刷することができます

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

1
彼の答えを編集することは、新しい答えを追加するよりも良いでしょう。
レナートバック

6

試すことができるものは次のとおりです。

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

5

見て 、この

mongoシェルからファイルに出力するため。mongosシェルからのcsvの出力はサポートされていません。JavaScriptを自分で作成するか、利用可能な多くのコンバーターの1つを使用する必要があります。たとえば、Googleは「jsonをcsvに変換」します。


1

私が使用している素晴らしいソリューションでここに量り込むだけです。これは、集約をサポートするという点で上記のLucky Soniのソリューションに似ていますが、フィールド名をハードコーディングする必要はありません。

cursor = db.<collection_name>.<my_query_with_aggregation>;

headerPrinted = false;
while (cursor.hasNext()) {
    item = cursor.next();
    
    if (!headerPrinted) {
        print(Object.keys(item).join(','));
        headerPrinted = true;
    }

    line = Object
        .keys(item)
        .map(function(prop) {
            return '"' + item[prop] + '"';
        })
        .join(',');
    print(line);
}

これを.jsファイルとして保存します。この場合は、次のように呼び出してexample.js、mongoコマンドラインで実行します。

mongo <database_name> example.js --quiet > example.csv

0

私は次のテクニックを使用します。これにより、列名をコンテンツと同期させるのが簡単になります。

var cursor = db.getCollection('Employees.Details').find({})

var header = []
var rows = []

var firstRow = true
cursor.forEach((doc) => 
{
    var cells = []
    
    if (firstRow) header.push("employee_number")
    cells.push(doc.EmpNum.valueOf())

    if (firstRow) header.push("name")
    cells.push(doc.FullName.valueOf())    

    if (firstRow) header.push("dob")
    cells.push(doc.DateOfBirth.valueOf())   
    
    row = cells.join(',')
    rows.push(row)    

    firstRow =  false
})

print(header.join(','))
print(rows.join('\n'))

0

リモートサーバーでスクリプトを実行する場合。Mongoは独自のロギング出力を追加しますが、ファイルから省略したい場合があります。 --quietオプションは、接続関連のログのみを無効にします。すべてのmongoログではありません。このような場合、不要な行を手動で除外する必要があります。Windowsベースの例:

mongo dbname --username userName --password password --host replicaset/ip:port --quiet printDataToCsv.js | findstr /v "NETWORK" > data.csv

これにより、スクリプト出力がパイプfindstr処理され、NETWORK文字列を含むすべての行が除外されます。findstrの詳細:https//docs.microsoft.com/en-us/windows-server/administration/windows-commands/findstr

これのLinuxバージョンはを使用しますgrep

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.