2017-03-07 5 views
1

Ich habe keinen Zugriff auf mongodb Maschine. Daher kann ich keinen mongoexport-Befehl ausführen. Daher versuche ich, meine Abfrage Ausgabe im CSV-Format zu bekommen.RoboMongo Export zu CSV-Ausgabe zeigt Bson

Abfrage in RoboMongo

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); 
} 

Suche Abfrage Ausgang (in JSON) - 1 Zeile nur hier zur Verfügung gestellten

{ 
    "_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" 
} 

Output (in CSV)

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 

Gibt es eine Möglichkeit [Objekt BSON], um Zeichenfolge zu bekommen?

Mongo db Version 3.0.8 | Robomongo-Version Robomongo 0.9.0-RC8

+0

mongoexport über das Netzwerk funktioniert. Wenn du mit robomongo eine Verbindung zu mongodb herstellen kannst, solltest du dich mit mongoexport verbinden können. –

+0

Ich habe keinen Zugriff auf die Maschine installiert (ssh in die Box)! Aber Robomongo kann auf die Datenbank über den Port zugreifen, wie es aktiviert ist IP: PORT von Netzwerk-Team :) – smilyface

+0

Sie müssen nicht ssh. Führen Sie mongoexport auf demselben Computer aus, auf dem Sie robomongo mit den gleichen ip: port-Optionen ausführen. –

Antwort

0

diese hat für mich gearbeitet. Nun, ich bin mir nicht sicher, ob das der beste Weg ist oder nicht. Wie @Alex vorgeschlagen hat, könnte es andere Wege geben. Ich habe Kommentare in den Code hinzugefügt, so dass sie leicht zu lesen und zu verstehen sind.

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#"); 
}); 

Ausgabe wird nicht formatiert. Der 'print' Befehl schreibt immer mit einer neuen Zeile! So, nachdem die Ausgabe bekommen werden Sie es mit einem Editor formatiert werden müssen (wie Notepad ++) ..

Letzte Ausgabe

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 ist flache 2d-Matrix, nicht in der Lage, komplexe Strukturen zu halten. Sie müssen Ihre Dokumente zu Top-Level-Primitiven project.

Für Ihr Dokument muss es so etwas wie folgt (Mongo 3.2+) sein:

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 
    }} 
]); 

und wenn Ihr Arrays mehr als 1 Element haben oder Mongo Version < 3.2 Sie müssen sie zum Entspannen zuerst:

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 
    }} 

]); 

Es wird mit CSV freundliche Ausgabe führen:

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

Danke Alex. Aber ich bekomme eine Ausnahme: assert: Befehl fehlgeschlagen \t "errmsg": "Ausnahme: ungültiger Operator '$ arrayElemAt'", "code": 15999, | Mongo db Version 3.0.8 | Robomongo Version Robomongo 0.9.0-RC8 – smilyface

+0

Fair genug, ich habe ein Beispiel für alte Versionen der db hinzugefügt. –

+0

Ich habe es auf andere Weise versucht und es hat gut funktioniert. Danke für Ihre Hilfe. Ich habe die Antwort hinzugefügt. – smilyface