2014-07-01 25 views
6

Tôi có một loạt tài liệu trong mongodb và tất cả đều có trường dấu thời gian có dấu thời gian được lưu trữ là "1404008160". Tôi muốn sắp xếp tất cả tài liệu trong bộ sưu tập này theo thứ tự desc. Tôi làm điều đó bằng cách:sắp xếp tài liệu mongodb theo dấu thời gian (theo thứ tự desc)

sort = [('timestamp', DESCENDING)] 
collection.find(limit=10).sort(sort) 

Tuy nhiên, tôi không nhận được kết quả được sắp xếp theo dấu thời gian theo thứ tự desc. Tôi nghĩ đó là vì dấu thời gian đang được coi là một trường int. Có một công việc xung quanh điều này mà không thay đổi kiểu dữ liệu của trường dấu thời gian. Tôi đã có rất nhiều dữ liệu trong bộ sưu tập này, do đó, tôi không muốn trải qua các rắc rối khi nhập/xuất, v.v.

Ngoài ra - tôi muốn giữ tải để phân loại thành mongod chứ không phải làm theo trình tự trong python .

Để rõ ràng: Dấu thời gian không cho biết thời điểm tài liệu được tạo và được lưu trữ dưới dạng chuỗi (ví dụ: "1404217646").

Xin cảm ơn trước.

+0

Tôi giả sử bạn đã nhập hằng mà nếu không sẽ được biểu diễn dưới dạng 'pymongo.DESCENDING'. Nhưng thực sự đó chỉ là một hằng số cho '-1' để làm cho việc đọc dễ dàng hơn. Như một 'int' không nên quan trọng như các giá trị nên đặt hàng theo cách đó. Có thể là những chuỗi thực sự này? Có nghĩa là, những dấu ngoặc kép đó xuất hiện khi bạn nhìn vào dữ liệu trong trình bao? –

+0

có - dấu ngoặc kép xuất hiện - vì vậy dấu thời gian được lưu trữ dưới dạng chuỗi .. và tôi đang tìm giải pháp thay thế mà không thay đổi kiểu dữ liệu của trường này trong tất cả tài liệu hiện có – jisu

+0

Thực sự không phải là một giải pháp. Ngay cả khi chuỗi này vẫn nên sắp xếp chính xác như các giá trị là từ vựng. Trừ khi tất nhiên một số là số và một số là các chuỗi, điều này sẽ gây ra vấn đề. Nếu bạn đang tìm kiếm một cách để MongoDB "đúc" các giá trị, thì điều đó sẽ không xảy ra, bên ngoài chuỗi tấn công, nhưng điều đó sẽ không hiệu quả. Bạn thực sự cần phải thay đổi loại. Hình thức tốt nhất là ngày BSON, chỉ lưu trữ nội bộ giá trị dấu thời gian, nhưng sẽ tự động truyền dưới dạng ngày tháng trong chương trình của bạn. –

Trả lời

15

Giả sử dấu thời gian của bạn cho biết thời điểm tài liệu được tạo, you can use _id instead.

_id ObjectId in mongo lưu dấu thời gian của bạn. Hãy thử như sau:

sort = {'_id': -1} 
collection.find({}, limit=10).sort(sort) 

Nếu bạn vẫn muốn sắp xếp theo lĩnh vực tùy chỉnh timestamp của bạn, sau đây nên làm việc:

sort = {'timestamp': -1} 
collection.find({}, limit=10).sort(sort) 

Lưu ý rằng đây là giả định tất cả các timestamp lĩnh vực của bạn là cùng loại (string, int)

+0

Dấu thời gian không cho biết thời điểm tài liệu được tạo - vì vậy các bước trên sẽ không hoạt động. Không phải là hai giải pháp giống nhau? – jisu

+0

Bạn đang đúng - cố định. Giải pháp thứ hai hoạt động? Nếu không, bạn có thể cần phải ánh xạ dữ liệu của bạn đến cùng một loại. Có một cách nhanh chóng cho rằng –

+0

Giải pháp thứ hai cũng không hoạt động như dấu thời gian được lưu trữ dưới dạng chuỗi. Tôi có var sắp xếp của tôi thực hiện như vậy: [('dấu thời gian', -1)]. Dù sao, tôi sẽ quan tâm đến việc biết làm thế nào tôi có thể "ánh xạ dữ liệu cùng loại." Các giải pháp cuối cùng, tôi nghĩ, sẽ được tái tạo tài liệu vì vậy tất cả đều có dấu thời gian được lưu trữ trong định dạng ngày tháng. – jisu

4

bạn có thể sắp xếp bộ sưu tập của bạn trong thứ tự giảm dần bằng cách sử dụng sort({ 'timestamp': -1 }) .Cộng truy vấn sẽ như thế nào

này
collection.find().sort({ 'timestamp': -1 }).limit(10) 

Nếu bạn có kiến ​​thức sql, bạn có thể so sánh cả các truy vấn trong đường dẫn sau

http://docs.mongodb.org/manual/reference/sql-comparison/

+0

Cần lưu ý rằng mặc dù điều này hoạt động vì nó là một lĩnh vực duy nhất bạn đang phân loại theo nó không phải là cách tốt nhất để làm điều đó trong python vì dicts là không có thứ tự – Sammaye

+0

@Sammaye, tôi nghĩ rằng có nhiều tệp và dấu thời gian là một trường chung trong bộ sưu tập. – Mulagala

+0

Có nhiều trường trong tài liệu nhưng trong đặc tả sắp xếp, bạn chỉ cung cấp một trường. – Sammaye

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