2011-08-09 20 views
31

Tôi đang cố gắng sử dụng lệnh mongodump để loại bỏ một loạt các bản ghi được tạo vào một ngày cụ thể. Các bản ghi bao gồm một trường "ts" là một đối tượng MongoDB Date().Làm cách nào để tôi có thể sử dụng mongodump để loại bỏ các bản ghi khớp với một phạm vi ngày cụ thể?

mongodump lấy đối số -q có thể được sử dụng để chạy truy vấn để chọn các bản ghi được đưa vào kết xuất. Thật không may, đối số -q cần phải được cung cấp trong JSON và không rõ cách thể hiện truy vấn "nhỏ hơn ngày này, nhiều hơn ngày này" trong JSON thuần túy (thông thường các truy vấn như vậy sẽ sử dụng ' ? new Date()' constructor)"

Bất cứ lời khuyên tôi đã thử bằng cách sử dụng {$ date: unix-timestamp-in-mili giây}. định dạng nhưng nó không làm việc cho tôi

Trả lời

4

này nên làm việc, những gì ? không làm việc khoảng $ ngày truy vấn của bạn:

mongodump --query {"ts":{$gt:{$date:178929000}}} 
39

tôi giải quyết nó - câu thần chú ma thuật tôi đang tìm kiếm là:

mongodump --query "{\"ts\":{\"\$gt\":{\"\$date\":`date -d 2011-08-10 +%s`000},\"\$lte\":{\"\$date\":`date -d 2011-08-11 +%s`000}}}" 
+2

đừng ngại chấp nhận điều này như câu trả lời, làm việc cho tôi - không nhận ra tôi đã phải thoát khỏi các dấu hiệu đồng đô la. – kmfk

+0

có tài liệu nào đó cho định dạng ngày-trong-JSON bạn đang sử dụng ở đây không? ngày '\' ngày tháng 2 năm 2011-08-10 +% s \ '000' là gì? – ericsoco

+0

@ericsoco có vẻ như anh ta đang chạy lệnh shell để tạo ngày – colllin

20

Một phiên bản nhiều người có thể đọc hơn @ SimonWillison ấy thoát phiên bản: (. Lưu ý dollarsigns vẫn cần phải được thoát)

--query "{ time: { \$gt: new Date(1312959600000), \$lt: new Date(1313046000000) }}"

Tôi đã nhận các timestamps millisecond bằng cách tạo ra số ngày trong vỏ, ví dụ:

> var targetDateStart = new Date(2011, 7, 10); 
> var targetDateEnd = new Date(2011, 7, 11); 
> targetDateStart.getTime(); 
1312959600000 
> targetDateEnd.getTime(); 
1313046000000 
+4

'$' không cần thiết để thoát nếu bạn sử dụng dấu nháy đơn '''. Trong thực tế, đây là cách được khuyến nghị, '' {time: {$ gt: new Date (1312959600000), $ lt: new Date (1313046000000)}} '' –

2

sử dụng dấu nháy đơn xung quanh truy vấn. Tôi thấy rằng ISODate() không hoạt động.

mongodump --query '{"ts":{$gt:{$date:178929000}}}' 
6

Edit: cố định lỗi chính tả

Thêm một bản cập nhật:

  1. mongodump --query không hỗ trợ IsoDate, nhưng chấp nhận Date ở dạng mili giây.

  2. Vì lệnh date hoạt động khác trong OS X, date -d 2011-08-10 +%s không hoạt động đối với tôi. Nếu bạn đã chạy vào cùng một vấn đề, cố gắng đọc hướng dẫn hoặc sử dụng này:

    • Nhận thời gian hiện tại trong vài giây:

      date -j -f "%a %b %d %T %Z %Y" "`date`" "+%s" 
      
    • Nhận thời gian cụ thể trong vài giây:

      date -j -f "%Y-%m-%d %H:%M:%S" "2014-01-01 00:00:00" "+%s" 
      
  3. Sử dụng phiên bản báo giá đơn lẻ để tránh thoát.

    mongodump --query '{updated_at: { $gte: Date(1403280000000) } }' 
    
+0

Lệnh đầu tiên' Không chuyển đổi được \' \ 'ngày 15 tháng 3 năm 2015 10 : 49: 19 CEST '' sử dụng định dạng \ '\'% a% b% d% T% Z% Y''' Lệnh thứ hai cho tôi giống như javascripts 'Date.UTC (...)/1000' nhưng khác nhau từ 'ISODate (...). getTime()/1000' (trước 2 giờ vì tôi ở Pháp) – Rivenfall

+0

Nó thiếu một khung. Cú pháp chính xác là: 'mongodump --query '{updated_at: {$ gte: Ngày (1403280000000)}}'' – miduga

8

Trong MongoDB 3.2, chúng ta có thể sử dụng tùy chọn --queryFile với mongodump.

trước hết, tạo một tệp json:

//query.json 
{"serverTime": {"$gte": ISODate("2016-01-30T16:00:00.000Z"), "$lt": ISODate("2016-01-31T16:00:00.000Z")}} 

tiếp theo, sử dụng mongodump:

mongodump --db <dbName> --collection <collectionName> --queryFile query.json 

đơn giản và rõ ràng.

+2

không hoạt động với ISODate – dtc

Các vấn đề liên quan