2017-03-07 3 views
1

私はmongodbマシンにアクセスできません。だから私はmongoexportコマンドを実行することはできません。したがって、私はクエリ出力をCSV形式に変換しようとしています。 RoboMongoでroboMongoのCSV出力にエクスポートすると、bson

クエリ(JSON)で

var cursor = db.getCollection('fineProduct').find 
(
     {"inbuilt.bookingReference" : { $exists : true }} , 

     {"_id":1, 
     "Reference":1, 
     "inbuilt.bookingReference":1, 
     "inbuilt.status":1, 
     "purchase.fineSegments.departureDatetime":1, 
     "purchase.fineSegments.arrivalDatetime":1, 
     "purchase.fineSegments.product.carriage.type":1, 
     "purchase.fineSegments.pricing.amount":1, 
     "purchase.fineSegments.pricing.currency":1 
     }  
) 
while (cursor.hasNext()) { 
    var record = cursor.next(); 
    var output = ""; 
    for (var i in record) { 
     output += record[i] + ","; 
    }; 
    output = output.substring(0, output.length - 1); 
    print(output); 
} 

検索クエリ出力 - のみ(CSV)に

出力

{ 
    "_id" : 10, 
    "inbuilt" : { 
     "status" : "VALIDATED", 
     "bookingReference" : "2015900051789" 
    }, 
    "purchase" : [ 
     { 
      "fineSegments" : [ 
       { 
        "departureDatetime" : ISODate("2015-09-30T18:35:00.000Z"), 
        "arrivalDatetime" : ISODate("2015-09-30T19:17:00.000Z"), 
        "product" : { 
         "carriage" : { 
          "type" : "House" 
         } 
        }, 
        "pricing" : { 
         "amount" : "339.00", 
         "currency" : "INR" 
        } 
       } 
      ] 
     } 
    ], 
    "vendorReference" : "FIRE" 
} 
ここで提供される1行

10,[object BSON],[object BSON],FIRE 
12,[object BSON],[object BSON],FIRE 
13,[object BSON],[object BSON],FIRE 
14,[object BSON],[object BSON],FIRE 
15,[object BSON],[object BSON],FIRE 
17,[object BSON],[object BSON],FIRE 
18,[object BSON],[object BSON],FIRE 
19,[object BSON],[object BSON],FIRE 
20,[object BSON],[object BSON],FIRE 

文字列に[オブジェクトBSON]を取得する方法はありますか?

Mongo db version 3.0.8 | robomongoバージョンRobomongo 0.9.0-RC8

+0

。あなたがrobomongoでmongodbに接続できるなら、あなたはmongoexportでそれに接続できるはずです。 –

+0

私はインストールされたマシンにアクセスできません(ボックスにsshへ)!しかし、robomongoは有効になっているのでポートを介してデータベースにアクセスできます。ネットワークチームによるポート: – smilyface

+0

sshは必要ありません。同じip:portオプションを指定してrobomongoを実行する同じマシンでmongoexportを実行します。 –

答えて

0

これを私のために働いた。まあ、これが最善の方法であるかどうかはわかりません。 @Alexが示唆しているように、他の方法があるかもしれません。コードにコメントを追加して、読みやすく理解しやすくしました。

db.getCollection('fineProduct').find 
(
     {"inbuilt.bookingReference" : { $exists : true }} , 

     {"_id":0, //NOT to print ID 
     "vendorReference":1, //col1 
     "inbuilt.bookingReference":1, //col2 
     "inbuilt.status":1, //col3 
     "purchase.fineSegments.departureDatetime":1, //col4 
     "purchase.fineSegments.arrivalDatetime":1, //col5 
     "purchase.fineSegments.product.carriage.type":1, //col6 
     "purchase.fineSegments.pricing.amount":1, //col7 
     "purchase.fineSegments.pricing.currency":1 //col8 
     }  
) 
.limit(3) //limit to 3 rows (remove this once done) 
.forEach(function (x) { 

    //col1 : "vendorReference" 
    print(x.vendorReference + ","); 

    //col2 : "inbuilt.bookingReference" 
    print(x.inbuilt.bookingReference + ","); 

    //col3 : "inbuilt.status" 
    print(x.inbuilt.status + ","); 

    //col4 : "purchase.fineSegments.departureDatetime" 
    x.purchase.forEach(function (y) { 
     if (y.fineSegments instanceof Array) { 
      y.fineSegments.forEach(function (z) { 
       print(z.departureDatetime + ","); 
      }); 
     } 
    }); 

    //col5 : "purchase.fineSegments.arrivalDatetime" 
    x.purchase.forEach(function (y) { 
     if (y.fineSegments instanceof Array) { 
      y.fineSegments.forEach(function (z) { 
       print(z.arrivalDatetime + ","); 
      }); 
     } 
    }); 

    //col6 : "purchase.fineSegments.product.carriage.type" 
    x.purchase.forEach(function (y) { 
     if (y.fineSegments instanceof Array) { 
      y.fineSegments.forEach(function (z) { 
       print(z.product.carriage.type + ","); // used dot as it is not in array with closed bracket 
      }); 
     } 
    }); 

    //col7 : "purchase.fineSegments.pricing.amount" 
    x.purchase.forEach(function (y) { 
     if (y.fineSegments instanceof Array) { 
      y.fineSegments.forEach(function (z) { 
       print(z.pricing.amount + ","); 
      }); 
     } 
    }); 

    //col8 "purchase.fineSegments.pricing.currency" 
    x.purchase.forEach(function (y) { 
     if (y.fineSegments instanceof Array) { 
      y.fineSegments.forEach(function (z) { 
       print(z.pricing.currency); 
      }); 
     } 
    }); 

    print("#line_end#"); 
}); 

出力はフォーマットされません。 'print'コマンドは常に新しい行を書く!だから、出力を取得した後、あなたは(メモ帳のような++)エディタでそれをフォーマットする必要があります。..

ネットワーク上で動作しますmongoexport最終出力

x1,y1,C,Thu Oct 01 2015,Thu Oct 01 2015,FIRE,233,INR 
x2,y3,A,Thu Oct 01 2015,Thu Oct 01 2015,FIRE,433,US 
x5,y4,B,Thu Oct 01 2015,Thu Oct 01 2015,FIRE,890,INR 
2

CSVはフラット2次元マトリックスであり、複雑な構造を保持することはできません。最高レベルのプリミティブに文書をprojectする必要があります。あなたの文書の場合、それは(3.2+モンゴ)を、以下のようなものでなければならない

db.getCollection('fineProduct').aggregate([ 
    {$project: { 
     _id: 1, 
     status: "$inbuilt.status", 
     bookingReference: "$inbuilt.bookingReference", 
     departureDatetime: { "$arrayElemAt": [ 
      { "$map": { 
       "input": { "$slice": [ 
        { "$map": { 
         "input": { "$slice": [ "$purchase", 0, 1 ] }, 
         "as": "el", 
         "in": "$$el.fineSegments" 
        }}, 
        0, 1 
       ]}, 
       "as": "el", 
       "in": { "$arrayElemAt": [ "$$el.departureDatetime", 0 ] } 
      }}, 
      0 
     ]}, 
     arrivalDatetime: { "$arrayElemAt": [ 
      { "$map": { 
       "input": { "$slice": [ 
        { "$map": { 
         "input": { "$slice": [ "$purchase", 0, 1 ] }, 
         "as": "el", 
         "in": "$$el.fineSegments" 
        }}, 
        0, 1 
       ]}, 
       "as": "el", 
       "in": { "$arrayElemAt": [ "$$el.arrivalDatetime", 0 ] } 
      }}, 
      0 
     ]}, 
     ..... etc 
    }} 
]); 

とあなたの配列が1つの以上の要素、またはモンゴバージョン< 3.2を持っている場合は、それらを最初にアンワインドする必要があります。

db.getCollection('c').aggregate([ 
    {$unwind: "$purchase"}, 
    {$unwind: "$purchase.fineSegments"}, 
    {$project: { 
     _id: 1, 
     status: "$inbuilt.status", 
     bookingReference: "$inbuilt.bookingReference", 
     departureDatetime: "$purchase.fineSegments.departureDatetime", 
     arrivalDatetime: "$purchase.fineSegments.arrivalDatetime", 
     ..... etc 
    }} 

]); 

これは、CSVフレンドリー出力となります:

{ 
    "_id" : 10.0, 
    "status" : "VALIDATED", 
    "bookingReference" : "2015900051789", 
    "departureDatetime" : ISODate("2015-09-30T18:35:00.000Z"), 
    "arrivalDatetime" : ISODate("2015-09-30T19:17:00.000Z"), 
    .... 
} 
+0

アレックスありがとう。しかし、私は例外が発生しています:アサート:コマンドが失敗しました\t "errmsg": "例外:無効な演算子 '$ arrayElemAt'"、 "code":15999、| Mongo dbバージョン3.0.8 | robomongoのバージョンRobomongo 0.9.0-RC8 – smilyface

+0

かなり古いですが、私はdbの古代版の例を追加しました。 –

+0

別の方法で試してみましたが、うまくいきました。ご協力ありがとうございました。私は答えを加えました。 – smilyface

関連する問題