为什么这样做:
# mongo dbname
MongoDB shell version: 1.8.3
connecting to: nextmuni_staging
> db.collection.find()
{ "foo" : "bar" }
> bye
虽然这不起作用:
# mongo localhost/dbname --eval 'db.collection.find()'
MongoDB shell version: 1.8.3
connecting to: localhost/dbname
DBQuery: dbname.collection -> undefined
它应该完全相同,不是吗?
谢谢!
答案 0 :(得分:24)
db.collection.find()
的返回值是游标类型。从shell中执行此命令将创建一个游标并显示第一页数据。你可以通过重复'it'命令开始完成剩下的工作。
我认为在执行eval'd脚本期间使用的变量范围仅适用于脚本的生命周期(当然数据可以保存到集合中),因此一旦脚本终止这些游标变量就不再存在,所以您将能够发送另一个eval脚本来分页数据。因此,在shell会话期间获得的行为无法通过eval脚本真正起作用。
要接近行为,您可以运行以下内容:
mongo dbname --eval "db.collection.find().forEach(printjson)"
这表明命令确实执行并产生一个游标,然后你可以迭代将输出发送到stdout。
编辑:我认为我试图提出的一点是,你发出的命令正在运行它的输出并不是你所期望的。
答案 1 :(得分:2)
使用printjson
编写脚本时mongo --eval '...'
函数涵盖了很多内容。而不是链接.forEach
,你可以简单地打电话。
$ 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
}