2009-04-28 5 views
12

Duplicate của"how does one get a count of rows in a datastore model in google appengine?"Google AppEngine: cách đếm các mục nhập của cơ sở dữ liệu vượt quá 1000?


Tôi muốn biết có bao nhiêu người sử dụng tôi có. Trước đây, tôi đã đạt được điều này với mã sau:

users = UserStore.all() 
user_count = users.count() 

Nhưng bây giờ tôi có hơn 1.000 người dùng và phương pháp này tiếp tục trả lại 1.000.

Có cách lập trình hiệu quả để biết tôi có bao nhiêu người dùng không?

Trả lời

14

Nó thực sự là một bản sao và bài viết khác mô tả làm thế nào về mặt lý thuyết làm điều đó, nhưng tôi muốn nhấn mạnh rằng bạn thực sự không nên làm đếm theo cách này. Lý do là BigTable bởi bản chất phân phối của nó thực sự là xấu cho cốt liệu. Những gì bạn có thể muốn làm là thêm một giao dịch truy cập vào thực thể đó, và nếu có rất nhiều giao dịch một truy cập sharded. Xem: http://code.google.com/appengine/articles/sharding_counters.html

UPDATE: Kể từ 1.3.1 con trỏ làm cho những thứ như thế này dễ dàng hơn rất nhiều: http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html#Query_Cursors

+2

1000. Việc đếm mọi người dùng cho mọi yêu cầu là một ý tưởng thực sự tồi tệ. –

+0

Tôi đã kết thúc việc thực hiện điều này! Cảm ơn một triệu, hiệu suất của tôi được cải thiện rất nhiều (: –

+0

Một cách khác để hoàn thành điều này mà không cần phải thực hiện các bộ đếm sharding bằng cách truy cập vào số liệu thống kê Datastore.Đây là giải thích đầy đủ về 3 phương pháp để đếm số lượng mục nhập cho một loại cụ thể: https://blog.svpino.com/2015/03/08/how-to-count-all-entries-of-a-given-type-in-the-app-engine-datastore – svpino

2

Sử dụng phân trang như các ví dụ sau here.

0

Tôi có viết phương pháp này để tính truy vấn, nhưng làm thế nào nói Nick Johnson có lẽ đó là một ý tưởng tồi ...

def query_counter (q, cursor=None, limit=500): 
    if cursor: 
     q.with_cursor (cursor) 
    count = q.count (limit=limit) 
    if count == limit: 
     return count + query_counter (q, q.cursor(), limit=limit) 
    return count 
2

Kể từ phiên bản 1.3.6 của SDK giới hạn 1000 về chức năng đếm đã được gỡ bỏ. Vì vậy, một cuộc gọi đến chức năng đếm giờ sẽ trả lại số lượng thực thể chính xác, ngay cả khi có nhiều hơn 1000. Chỉ giới hạn sẽ là nếu bạn có quá nhiều thực thể mà hàm đếm sẽ không trả về trước khi yêu cầu có thời gian chờ.

+0

Thay vì sử dụng tính() , làm thế nào về việc sử dụng len()? Kiểm tra ở đây: http://alwaysthecritic.typepad.com/atc/2009/02/google-app-engine-query-and-querycount.html – DocWiki

+0

Phương pháp đó là từ thời điểm nó vẫn còn có giới hạn 1000. –