0

私は Google App Engine をまったく初めて使用しています。Python を使用しており、名前と学年で学生用のモデルを作成し、レコードを保存しています。年齢ごとにグループ化されたカウントの学生を返す方法は?

for example 
25 years old    12 students
18 years old    125 students

等々 ...

from google.appengine.ext import ndb


class StudentModel(ndb.Model):
    name = ndb.StringProperty(indexed=True)
    age = ndb.IntegerProperty()
    date = ndb.DateTimeProperty(auto_now_add=True)
4

3 に答える 3

4

distinct=Trueまたはを使用group_by=['age']して、最初に一意の年齢を取得し、次にそれらを非同期にカウントすることもできます。しかし、大きなデータセットの最善の方法は、この数値を各プットのどこかに保存して更新することです。

ages = StudentModel.query(projection=['age'], distinct=True).fetch()

counts = {}
for age in ages:
  # query to get num of students for each age
  counts[age.age] = StudentModel.query(StudentModel.age == age.age).count_async()

# get result for each counter
for c in counts:
  counts[c] = counts[c].get_result()

for age in counts:
  print '%s years old \t %s students' % (age, counts[age])
于 2013-11-06T15:09:01.417 に答える
3

エンティティを追加するときに現在の合計を保持しない限り、すべてのエンティティに対してクエリを実行する必要があります。最も単純なmap方法は、クエリのメソッドを使用して年齢をcollections.Counter http://docs.python.org/2/library/collections.htmlに追加することです。

from collection import Counter
c = Counter()

def count(x):
   c[x.age]+=1

result = StudentModel.query().map(count)

cdict のキーである age を持つすべての年齢の集計を含むディクショナリです。result結果に各エンティティが必要な場合は、カウント関数が を返しますx

多数のエンティティがあり、正面向きのリクエストでこれを行おうとすると、簡単に時間がかかり、DeadlineExceededError が発生する可能性があります。エンティティが大きい場合は、射影クエリの方が少し速い場合があります。

于 2013-11-06T11:34:54.383 に答える
2

上記の答えは、非常に小さなデータセットに対してのみ機能します。大規模なデータセットの場合は、mapreduce などを使用する必要があります。それ以外の場合は、データストアの代わりに、グループ化と集計をサポートするクラウド sql を使用する必要があります。

于 2013-11-06T12:44:04.507 に答える