mongo dbname --eval 'db.collection.find()'无法工作。

21

为什么这个代码有效:

# 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

应该完全一样,不是吗?

谢谢!


完全有同样的问题。我注意到 'db.collection.drop()' 也可以起作用。 - mahemoff
2个回答

25
db.collection.find()的返回值是游标类型。在shell中执行这个命令将创建一个游标并显示第一页数据。您可以通过重复使用'it'命令来逐步查看其余数据。
我认为在eval脚本执行期间使用的变量范围仅限于脚本的生存周期(当然可以将数据持久化到集合中),所以一旦脚本终止,那些游标变量就不存在了,因此您可以发送另一个eval脚本来分页数据。因此,在eval脚本中不会得到与在shell会话中相同的行为。
要接近这种行为,您可以运行类似以下内容的代码:
mongo dbname --eval "db.collection.find().forEach(printjson)"

这表明该命令确实被执行并且生成了一个游标,您可以迭代并将输出发送到标准输出流。

编辑:我认为我想要表达的是,您发出的命令正在工作,只是输出不符合您的预期。


谢谢,这真的很烦人,难以解决。 - xamox

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接