2014-04-16 16 views
14

tôi cố gắng để chạy một lệnh tổng hợp:"Một đối tượng đường ống giai đoạn đặc tả phải chứa chính xác một trường" khi sử dụng OrderedDict

request = collections.OrderedDict([ 
     ("$unwind", "$tags"), 
     ("$group", { "_id" : "$tags" , "count" : { "$sum" : 1 } }), 
     ("$project", { "_id" : 0, "tag" : "$_id" , "count" : 1 }), 
     ("$sort", { "count" : -1 }), 
     ("$limit", 3)]) 

print client.devoxx.talks.aggregate(request) 

Nhưng MongoDB từ chối yêu cầu:

pymongo.errors.OperationFailure: command SON([('aggregate', u'talks'), ('pipeline', [OrderedDict([('$unwind', '$tags'), ('$group', {'count': {'$sum': 1}, '_id': '$tags'}), ('$project', {'count': 1, '_id': 0, 'tag': '$_id'}), ('$sort', {'count': -1}), ('$limit', 3)])])]) failed: exception: A pipeline stage specification object must contain exactly one field. 

Dường như với tôi rằng Tôi có từng giai đoạn tổng hợp trong một mục của lệnh dict.

+2

Nếu bạn có thể tái tạo điều này mà không sử dụng pymongo, nó sẽ rõ ràng hơn và bạn có thể loại bỏ thẻ python có thể không liên quan. –

+2

@ErikAllik Tôi cũng nói rằng thẻ không hợp lệ và bị xóa. Và tuyên bố là không cần thiết vì một Dict không được đặt hàng không phải là một đối số hợp lệ cho phương thức được gọi. –

Trả lời

12

Đây là probaby rất pymongo cụ thể nhưng nó cũng rất cần thiết như là hình thức tiêu chuẩn của đối số cho một đường ống kết hợp thực sự là một mảng và có thể cũng được chỉ đơn giản là quy định như vậy, ví dụ:

request = [{ "$unwind": "$tags"}, { "$group": { "_id": "$tags" } }] 

Mà luôn luôn sắp xếp theo thứ tự và như vậy không có vấn đề gì.

Vì vậy, không cần sử dụng OrderedDict.

Có lẽ bạn đang gây nhầm lẫn về hành vi với những thay đổi gần đây đối với vỏ mongo (từ 2.6) cho phép đối số được chỉ định mà không cần gói trong một mảng. Nhưng JSON như với một số ngôn ngữ khác mong đợi định nghĩa "từ điển/băm" của chúng để duy trì thứ tự được chỉ định của chúng.

Vì vậy, việc sử dụng cú pháp mảng/danh sách là vẫn còn triển khai được ưu tiên.

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