2011-09-08 58 views
18

为什么这个工作:蒙戈DBNAME --eval 'db.collection.find()' 不起作用

# 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

有完全相同的问题。我注意到'db.collection.drop()'也可以。 – mahemoff

回答

21

db.collection.find()的返回值是游标类型。在shell中执行此命令将创建一个光标并显示数据的第一页。你可以通过重复'it'命令来开始阅读剩下的内容。

我认为在执行eval'd脚本时使用的变量范围仅适用于脚本的生命周期(数据可以持久化到集合当然),因此一旦脚本终止那些游标变量不再存在并且所以你可以发送另一个eval脚本来分页数据。所以你在shell会话期间得到的行为从eval脚本中不会真正起作用。

为了更贴近的行为,你可以像这样运行的东西:

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

那说明您该命令不执行,并产生一个光标,然后您可以遍历发送输出到标准输出。

编辑:我想我要说的一点是,你发布的命令正在工作,它的输出不是你所期望的。

+0

谢谢,这是非常烦人的弄清楚。 – xamox

1

当使用mongo --eval '...'编写脚本时,printjson函数涵盖很多地方。而不是链接.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 
}