2010-07-12 27 views
5

Cách tốt nhất để xác định số lượng mô hình của một loại nhất định có trong kho dữ liệu của ứng dụng của tôi là gì? Tài liệu nói rằng MyKind.all().count() chỉ tốt hơn một chút so với truy xuất tất cả dữ liệu và có giới hạn là 1000. Điều này không hữu ích vì tôi dự kiến ​​có hơn 6000 trường hợp lưu trữ MyKind.GAE: Cách tốt nhất để xác định số lượng một loại được lưu trữ?

Có cách nào tốt hơn để thực hiện việc này không? Nếu tôi chỉ nhận được chìa khóa, và đếm những gì?

Tôi đang sử dụng Python.

+0

Sao chép câu hỏi hiện có: http://stackoverflow.com/questions/2988864/how-to-get-the-number-of-rows-in-a-table-in-a-datastore/2989513 –

Trả lời

1

Giữ đối tượng truy cập cho ứng dụng của bạn được lưu trữ trong cơ sở dữ liệu và cập nhật nó bất cứ khi nào bạn tạo và xóa đối tượng.

+0

Đó là sắp xếp của một cơn đau. Nó không phải là DRY, và bây giờ tôi phải đi săn tất cả các mã để tìm thấy bất kỳ thời gian mà 'MyKind' được tạo ra hoặc xóa. –

+2

@Rosarch Nếu 'MyKind' trường hợp là' put() 'trên tất cả các mã của bạn, có thể thiết kế của bạn sẽ được hưởng lợi từ ứng dụng nhất quán hơn của DRY. :-) –

3

Nếu bạn làm phím chỉ nó nên được khá nhanh, vì điều này chỉ có để đọc chỉ số và doesn 't thực sự lấy bất kỳ thực thể nào. Sử dụng con trỏ và vòng lặp cho đến khi số() trả về ít hơn 1000.

2

This SO question có câu trả lời (bởi @jgeewax) là gần như đúng (điều kiện thoát sai, như tôi đã nhận xét). Dưới đây là một cố định ...:

class MyModel(db.Expando): 
    @classmethod 
    def count_all(cls): 
     """ 
     Count *all* of the rows (without maxing out at 1000) 
     """ 
     count = 0 
     query = cls.all().order('__key__') 

     while True: 
      current_count = query.count() 
      if current_count == 0: return count 
      count += current_count 

      if current_count == 1000: 
       last_key = query.fetch(1, 999)[0].key() 
       query = query.filter('__key__ > ', last_key) 

     return count 

Vấn đề hiệu suất, tất nhiên, là điều này sẽ sử dụng một truy vấn thực tế để các kho dữ liệu cho mỗi 1000 mục bạn đã - denormalizing thứ bằng cách giữ một số lượng thực tế, như @Chris đề xuất, sẽ sử dụng đến nay ít hơn ít truy vấn hơn. (Hãy chắc chắn sử dụng một số điện thoại sharded counter hoặc các dạng khác của efficient counters làm Người hâm mộ của App Engine giải thích!).

Việc không chuẩn hóa là một thực tế của cuộc sống với DB không quan hệ và được thực hiện đúng cách, có thể tạo ra sự khác biệt lớn cho hiệu suất của bạn to. Đối với những lo lắng mà bạn thể hiện về DRY, chỉ cần sử dụng các phương thức lớp hoặc các dạng hàm khác để thực hiện tất cả các lần đặt và loại bỏ các thực thể của bạn (ví dụ: [[ngoại trừ trong các phương thức lớp được đề cập]], không bao giờ các phương thức gọi như .put() trực tiếp trên các thực thể, hãy gọi các phương thức lớp thích hợp thay thế!), và các chức năng đó sẽ là nơi hiển nhiên để giữ cho các bộ đếm không chuẩn hóa được cập nhật!

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