2012-01-23 11 views
41

È possibile scrivere il risultato della query sul file dallo script mongo js. Ho cercato molto, ma non ho trovato alcuna soluzione.Operazioni di scrittura dei file nello script mongo?

es: -

cursor = db.users.find(); 

while(cursor.hasNext()) { 
    cursor.next(); 
    // writing the cursor output to file ????<br/> 
} 
+1

btw, se si sta sempre iterando l'intera raccolta di quanto sia più efficiente usare mongodump. l'utilizzo di uno script è più flessibile, è possibile eseguire tutti i tipi di elaborazione prima di stampare i risultati. – milan

+0

altro su [mongodump] (http://stackoverflow.com/questions/8991292/dump-mongo-collection-into-json-format) – averasko

risposta

70

Si potrebbe utilizzare la stampa e quindi reindirizzare uscita:

script.js:

cursor = db.users.find(); 
while(cursor.hasNext()){ 
    printjson(cursor.next()); 
} 

quindi eseguire lo script e reindirizzare output in un file:

mongo --quiet script.js > result.txt 
+1

sì, è possibile. Ma sto cercando di eseguire lo script come daemon. Quindi ho chiesto solo le operazioni di scrittura dei file. Grazie. L'output del processo daemon – sudesh

+0

può anche essere reindirizzato a un file. potresti scrivere uno script di shell attorno ad esso, invocare mongo su demo.js e reindirizzare a un file. – milan

+1

Come posso specificare quale database deve essere utilizzato dallo script? – Nelu

3

Non sarebbe più semplice da usare uno dei Mongo drivers per un linguaggio general purpose (come Python, Ruby, Java, ecc) e scrivere i risultati in un file modo, in un formato che puoi usare (come CSV, ecc.)?

UPDATE: In base alla documentazione per mongodump è possibile esportare una raccolta con una query:

$ ./mongodump --db blog --collection posts 
-q '{"created_at" : { "$gte" : {"$date" : 1293868800000}, 
         "$lt" : {"$date" : 1296460800000} 
        } 
    }' 

Tuttavia si avrebbe bisogno di importare che la raccolta di nuovo in MongoDB per operare su di esso o utilizzare mongoexport esportare come JSON o CSV utilizzando lo stesso flag di query (-q) come mongodump.

+0

grazie per la tua risposta, ma voglio che questo sia in js normale che funziona usando mongo conchiglia. – sudesh

21

http://www.mongodb.org/display/DOCS/Scripting+the+shell paragrafo "Differenze tra scripted e interactive/Printing ".

./mongo server.com/mydb --quiet --eval "db.users.find(). ForEach (printjson);" > 1.txt

+0

Grande trucco! Senza file. – ruX

+0

Questo approccio diventa complicato se vuoi inserire una query all'interno del find (In questo caso, è meglio usare la risposta di @milan sopra con un file di query separato – AndrewL

+0

@AndrewL Puoi usare le virgolette singole? Penso che non si debba fare tanto fuggire o qualcosa del genere, giusto? – Erhannis

12

È possibile saltare il ciclo durante l'uso forEach():

db.users.find().forEach(printjson); 
+7

Ancora più compatto: db.users.find(). ForEach (printjson); – AndrewL

2

Per distinta è necessario creare un file script.js con contenuti:

mongo = new Mongo("localhost"); 
doctor = mongo.getDB("doctor"); 
users = doctor.getCollection("users"); 
cities = users.distinct("address.city"); 
printjson(cities); 

poi in prova di console:

mongo --quiet script.js > result.txt 
Problemi correlati