2011-09-08 6 views
18

¿Por qué este trabajo:mongo nombredb --eval 'db.collection.find()' no funciona

# mongo dbname 
MongoDB shell version: 1.8.3 
connecting to: nextmuni_staging 
> db.collection.find() 
{ "foo" : "bar" } 
> bye 

Si bien esto no funciona:

# mongo localhost/dbname --eval 'db.collection.find()' 
MongoDB shell version: 1.8.3 
connecting to: localhost/dbname 
DBQuery: dbname.collection -> undefined 

Debe ser exactamente el lo mismo, ¿no?

Gracias!

+0

Tenía exactamente el mismo problema. Noto que 'db.collection.drop()' también funciona. – mahemoff

Respuesta

21

El valor de retorno de db.collection.find() es un tipo de cursor. Ejecutar este comando desde dentro del shell creará un cursor y le mostrará la primera página de datos. Puede comenzar por el resto repitiendo el comando 'it'.

Creo que el alcance de las variables utilizadas durante la ejecución de un script eval'd es solo durante el tiempo de vida del script (los datos pueden persistir en colecciones por supuesto) así que una vez que el script termina esas variables del cursor ya no existen para que pueda enviar otro script eval a la página de los datos. Entonces, el comportamiento que obtienes durante una sesión de shell no funcionaría realmente desde un script eval.

para acercarse al comportamiento podría ejecutar algo como esto:

mongo dbname --eval "db.collection.find().forEach(printjson)" 

Eso muestra que el comando no hace ejecutar y producir un cursor que luego se puede iterar sobre el envío de la salida a la salida estándar.

Editar: Creo que el punto que estaba tratando de hacer es que el comando que está emitiendo funciona, solo que el resultado no es el esperado.

+0

Gracias, esto fue muy molesto de averiguar. – xamox

1

Las funciones printjson cubren una gran cantidad de terreno cuando se scripting con mongo --eval '...'. En lugar de encadenar .forEach, simplemente puede ajustar su llamada.

$ mongo --eval 'db.stats_data.stats()' db_name 
MongoDB shell version: 2.4.14 
connecting to: db_name 
[object Object] 

$ mongo --eval 'db.stats_data.stats().forEach(printjson)' db_name 
MongoDB shell version: 2.4.14 
connecting to: db_name 
Tue Jan 10 15:32:11.961 TypeError: Object [object Object] has no method 'forEach' 

$ mongo --eval 'printjson(db.stats_data.stats())' db_name 
MongoDB shell version: 2.4.14 
connecting to: db_name 
{ 
    "ns" : "db_name.stats_data", 
    "count" : 5516290, 
    "size" : 789938800, 
    "avgObjSize" : 143.20110073980882, 
    "storageSize" : 1164914688, 
    "numExtents" : 18, 
    "nindexes" : 3, 
    "lastExtentSize" : 307515392, 
    "paddingFactor" : 1.0000000000000457, 
    "systemFlags" : 1, 
    "userFlags" : 0, 
    "totalIndexSize" : 1441559616, 
    "indexSizes" : { 
     "_id_" : 185292688, 
     "owner_id_key_idx" : 427678384, 
     "onwer_metric_key_idx" : 828588544 
    }, 
    "ok" : 1 
}