2011-09-08 63 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 
}