2013-07-31 34 views
6

Tôi có bảng MYSQL với các bản ghi tên của người và thời gian đến được xuất hiện dưới dạng một số. Hãy nghĩ về nó như một cuộc chạy đua. Tôi muốn biết có bao nhiêu người đến vào một khoảng cách thời gian nhất định người nơi được đặt tên giống nhau, vì vậy:Di chuyển đến MongoDB: cách truy vấn GROUP BY + WHERE

SELECT name, COUNT(*) FROM mydb.mytable 
WHERE Time>=100 AND Time<=1000 
GROUP BY name 

Và như kết quả tôi nhận được:

Susan, 1 
John, 4 
Frederick, 1 
Paul, 2 

Tôi chuyển sang MongoDB bây giờ, và sử dụng Python để viết mã (vì vậy tôi yêu cầu trợ giúp Pymongo). Tôi đã thử tìm kiếm thông tin về GROUP BY tương đương (ngay cả khi tôi đã đọc rằng cơ sở dữ liệu NoSQL tệ hơn ở loại hoạt động này so với SQL), nhưng vì chúng đã phát hành API đồng ý mới, tôi không thể tìm thấy ví dụ đơn giản như thế này được giải quyết bằng phương pháp nhóm, phương pháp Map-Reduce hoặc API đồng ý hoàn toàn mới.

Bất kỳ trợ giúp nào?

Trả lời

17

Có các ví dụ về tài liệu này trên tất cả tài liệu, Google và trang web này.

Một số tài liệu tham khảo:

Và đối với một số mã:

self.db.aggregate(
    # Lets find our records 
    {"$match":{"Time":{"$gte":100,"$lte":1000}}}, 

    # Now lets group on the name counting how many grouped documents we have 
    {"$group":{"_id":"$name", "sum":{"$sum":1}}} 
) 
+0

Tôi nghĩ rằng việc sử dụng $ name là những gì khiến tôi nghi ngờ làm thế nào để làm điều đó, vì tên là tên của trường tại cơ sở dữ liệu, không phải là một thẻ pymongo. Tại sao tên của trường vào nhóm bằng cách thể hiện như thế? –

+1

@RomanRdgz Nếu tôi thành thật tôi không biết, đó là một quyết định thiết kế mà bạn sẽ phải hỏi 10gen về, tuy nhiên, không có '$' chuỗi được coi là chữ trong MongoDB, đó là '$' mà làm cho MongoDB phản ứng như thể nó là một giá trị trường – Sammaye