2012-04-09 32 views
8

Tôi đang cố sắp xếp một bộ sưu tập có tên là user_score bằng cách sử dụng phím position và nhận được tài liệu đầu tiên của kết quả. Trong trường hợp này, bộ sưu tập user_score không tồn tại và tôi đã hy vọng nhận được kết quả là None, nhưng tôi đã nhận được một con trỏ trở lại.pymongo sort and find_one issue

1. result =

db.user_score.find({'score':'$lt':score}}).sort("position,pymongo.DESCENDING").limit(1) 

Bây giờ tôi đã thay đổi truy vấn của tôi như dưới đây và đã không nhận được bất cứ điều gì như mong đợi.

2. result =

db.user_score.find_one({'score':{'$lt':score}}, sort=[("position", pymongo.DESCENDING)]) 

vấn đề với truy vấn đầu tiên của tôi là gì?

Cảm ơn

Trả lời

2

Đây là hành vi mongodb mặc định khi tìm. Bất cứ khi nào bạn sử dụng find bạn sẽ nhận được một danh sách kết quả (trong trường hợp này là một con trỏ có thể lặp lại). Chỉ findOne - hoặc tương đương PyMongo find_one sẽ trả lại None nếu truy vấn không có kết quả phù hợp.

9

Trong truy vấn đầu tiên của bạn, trong hàm sắp xếp, bạn đang chuyển một đối số ("position,pymongo.DESCENDING"), khi bạn phải chuyển hai đối số ("position", pymongo.DESCENDING).

Hãy nhớ ghi dấu ngoặc kép của bạn.

-1

Sử dụng danh sách để chuyển đổi giá trị của con trỏ vào một dict:

list(db.user_score.find({'score':'$lt':score}}).sort("position",pymongo.DESCENDING).limit(1))[0]

+0

Đây cũng là cách tôi giải quyết nó. find_one không lấy .sort, nhưng find() hiện, do đó, phân loại, hạn chế và nhận được mục danh sách đầu tiên là con đường để đi – pojda

0

Một chút trễ trong phản ứng của tôi, nhưng có vẻ như phiên bản hiện tại của PyMongo không hỗ trợ một hoạt động sort trên một cuộc gọi find_one .

Từ trang tài liệu here (xin grep phần cho find_one):

Tất cả các lập luận để tìm() cũng là đối số hợp lệ cho find_one(), mặc dù bất kỳ lý lẽ giới hạn sẽ bị bỏ qua. Trả về một tài liệu duy nhất hoặc Không nếu không tìm thấy tài liệu phù hợp.

sử dụng Ví dụ như sau:

filterdict = {'email' : '[email protected]'} 
collection.find_one(filterdict, sort=[('lastseen', 1)]) 

Hope this helps nhiều người tìm kiếm gần đây!