2011-10-19 28 views
23

Bạn có thể sử dụng mongodump để đổ các tài liệu "x" mới nhất từ ​​một bộ sưu tập không? Ví dụ: trong vỏ mongo bạn có thể thực thi:Có thể giả định các bản ghi "x" cuối cùng từ một bộ sưu tập không?

db.stats.find().sort({$natural:-1}).limit(10); 

Có khả năng này tương tự với mongodump không?

Tôi đoán cách giải quyết là đổ các tài liệu trên vào một bộ sưu tập tạm thời mới và mongodump toàn bộ bộ sưu tập temp, nhưng sẽ tuyệt vời để có thể thực hiện điều này thông qua mongodump.

Cảm ơn trước,

Michael

+0

yêu cầu tương tự, nhưng tôi muốn ghi n mới nhất cho mỗi bộ sưu tập để thiết lập dev/máy chủ thử nghiệm . – Yarco

Trả lời

37

mongodump không hiển thị đầy đủ giao diện con trỏ. Nhưng bạn có thể làm việc xung quanh nó, sử dụng tham số --query. tiên nhận được tổng số tài liệu của bộ sưu tập

db.collection.count() 

Hãy nói rằng có 10000 văn bản và bạn muốn cuối 1000. Để làm như vậy có được id của tài liệu đầu tiên bạn muốn đổ.

db.collection.find().sort({_id:1}).skip(10000 - 1000).limit(1) 

Trong ví dụ này, id là "50ad7bce1a3e927d690385ec". Bây giờ bạn có thể nạp mongodump với thông tin này, để đổ tất cả tài liệu có id cao hơn hoặc bằng nhau.

$ mongodump -d 'your_database' -c 'your_collection' -q '{_id: {$gte: ObjectId("50ad7bce1a3e927d690385ec")}}' 

CẬP NHẬT Các thông số mới --limit--skip đã được thêm vào mongoexport sẽ có thể có sẵn trong các phiên bản tiếp theo của công cụ này: https://github.com/mongodb/mongo/pull/307

+1

Câu trả lời rất thông minh ... đẹp nhất! –

+2

'db.collection.find(). Sắp xếp ({_ id: -1}). Skip (1000) .limit (1)' cũng thực hiện thủ thuật và có phần thưởng mà bạn không cần phải lặp qua tất cả các bản ghi trước đó. – RickyA

+0

Ngoài ra, trong dòng 'mongodump':' $ lte' phải là '$ gte'. – RickyA

0

Các find() chức năng có một tham số tùy chọn thứ hai, trong đó quy định cụ thể mà các phím để được trả lại. Toán tử "$ slice" đặc biệt có thể được sử dụng để trả về một tập con của các phần tử cho một khóa mảng.

Ví dụ, nếu chúng ta muốn trả lại 10 bình luận đầu tiên về một bộ sưu tập blog (ví dụ), chúng ta có thể làm điều này:

db.blog.posts.find(criteria, {"comments" : {"$slice" : 10}}) 

Ngoài ra, nếu chúng ta muốn trả lại 10 ý kiến ​​cuối cùng, chúng tôi có thể sử dụng -10:

db.blog.posts.find(criteria, {"comments" : {"$slice" : -10}}) 

Hy vọng điều này hữu ích cho bạn.

Chúc may mắn!

4

mongodump supports the --query operator. Nếu bạn có thể chỉ định truy vấn của mình làm truy vấn json, bạn sẽ có thể thực hiện điều đó.

Nếu không, thì mẹo của bạn để chạy truy vấn để kết xuất các bản ghi vào bộ sưu tập tạm thời và sau đó bán phá giá sẽ hoạt động tốt. Trong trường hợp này, bạn có thể tự động hóa việc kết xuất bằng cách sử dụng một kịch bản lệnh shell để gọi một mongo với một lệnh javascript để làm những gì bạn muốn và sau đó gọi mongodump.

+1

bên phải, chương trình mongodump sẽ cho phép truy vấn, nhưng không cho phép bạn thêm giới hạn. Cảm ơn bạn đã xác nhận logic phụ của tôi, đó là những gì tôi đã làm cuối cùng. –

+0

liên kết được cập nhật: http://docs.mongodb.org/manual/reference/mongodump/ – ericsoco

0

Tôi đã chơi với một yêu cầu tương tự (sử dụng mongodump) nơi Tôi muốn thực hiện sao lưu và khôi phục tuần tự. Tôi sẽ lấy từ dấu thời gian lưu trữ cuối cùng. tôi không thể vượt qua --query '{dấu thời gian: {$ gte: $ STIME, $ lt: $ etime}}'

Một số điểm cần lưu ý: 1) sử dụng dấu nháy đơn thay vì đôi 2) không thoát $ hoặc bất cứ điều gì 3) thay thế $ stime/$ etime với số thực sẽ làm cho truy vấn làm việc 4) vấn đề tôi đã có được với $ stime/$ etime giải quyết trước khi mongodump thực hiện chính nó dưới -x nó cho thấy là + eval mongodump --query '{TIMESTAMP: {\ $ gte: $ utc_stime, \ $ lt: $ utc_etime}}' ++ mongodump --query '{TIMESTAMP: $ gte: 1366700243}' '{TIMESTAMP: $ lt : 1366700253} '

Địa ngục, vấn đề là hiển nhiên. truy vấn được chuyển đổi thành hai điều kiện.

Giải pháp là phức tạp và tôi nhận được sau khi thử nghiệm lặp lại .... thoát {và} tức là sử dụng {..}. Điều này khắc phục sự cố.

3

Building tắt của câu trả lời Mic92, để có được 1.000 mặt hàng mới nhất từ ​​một bộ sưu tập:

Tìm _id của 1000 mục gần đây nhất:

db.collection.find('', {'_id':1}).sort({_id:-1}).skip(1000).limit(1)

Nó sẽ là một cái gì đó giống như 50ad7bce1a3e927d690385ec .

Sau đó vượt qua _id này trong một truy vấn để mongodump:

$ mongodump -d 'your_database' -c 'your_collection' -q '{_id: {$gt: ObjectId("50ad7bce1a3e927d690385ec")}}'

+0

Sửa lỗi nhỏ: mã này đổ 1001 bản ghi. Bạn có thể thay thế $ gte bằng $ gt. –

0

thử điều này:

NUM=10000  
doc=selected_doc 
taskid=$(mongo 127.0.0.1/selected_db -u username -p password --eval "db.${doc}.find({}, {_id: 1}).sort({_id: -1}).skip($NUM).limit(1)" | grep -E -o '"[0-9a-f]+"') 
mongodump --collection $doc --db selected_db --host 127.0.0.1 -u username -p password -q "{_id: {\$gte: $taskid}}" --out ${doc}.dump 
Các vấn đề liên quan