2011-09-08 25 views
18

Tại sao công việc này:Mongo dbname --eval 'db.collection.find()' không hoạt động

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

Trong khi điều này không làm việc:

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

Nó phải là chính xác cùng, không?

Cảm ơn!

+0

Có chính xác cùng một vấn đề. Tôi nhận thấy 'db.collection.drop()' cũng hoạt động. – mahemoff

Trả lời

21

Giá trị trả lại của db.collection.find() là loại con trỏ. Việc thực hiện lệnh này từ bên trong trình bao sẽ tạo một con trỏ và hiển thị cho bạn trang dữ liệu đầu tiên. Bạn có thể bắt đầu thực hiện phần còn lại bằng cách lặp lại lệnh 'it'. Tôi nghĩ phạm vi của các biến được sử dụng trong quá trình thực thi kịch bản lệnh ước tính chỉ dành cho tuổi thọ của tập lệnh (dữ liệu có thể được lưu vào bộ sưu tập của khóa học), vì vậy khi tập lệnh chấm dứt các biến con trỏ đó không còn tồn tại nữa và vì vậy bạn có thể gửi một tập lệnh eval khác để trang dữ liệu. Vì vậy, các hành vi bạn nhận được trong một phiên làm việc sẽ không thực sự làm việc từ một kịch bản eval.

Để có được gần gũi với hoạt động bạn có thể chạy một cái gì đó như thế này:

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

Điều đó cho thấy bạn biết rằng các lệnh không thực hiện và tạo ra một con trỏ mà sau đó bạn có thể duyệt qua gửi kết quả đến stdout.

Chỉnh sửa: Tôi nghĩ rằng điểm mà tôi đang cố gắng thực hiện là lệnh bạn đang phát hành đang làm việc chỉ là đầu ra của nó không phải là những gì bạn mong đợi.

+0

Cảm ơn, điều này thật khó chịu để tìm ra. – xamox

1

Các chức năng printjson bao gồm rất nhiều nền tảng khi tập lệnh với mongo --eval '...'. Thay vì chuỗi .forEach, bạn có thể chỉ cần thực hiện cuộc gọi của mình.

$ 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 
} 
Các vấn đề liên quan