2017-05-23 30 views
3

ダーツライブラリgcloudを使用してデータストアにアクセスしています。ユーザーの総数を表示したいと考えています。もちろんダーツのデータストアに格納されている種類のエンティティの総数を取得するには、どのような方法が推奨されますか?

、これを実行する最も簡単な方法は次のとおりです。

db.query(User).run().length 

が、これは、すべてのユーザーを取得します。

ダーツgcloudライブラリでこのクエリを効率的に実行する方法はありますか?そうでない場合、すべてのエンティティを照会することは大きなパフォーマンス上の問題になります。また、ユーザーの総数を別のエンティティに格納する必要がありますか?

答えて

3

Googleクラウドデータストアは予約__xxx__名前を使用してデータストアのメタデータを照会するために使用することができ特別なエンティティの種類の数を提供します。

このメカニズムを使用すると、たとえば、 __namespace__を使用してすべての名前空間を照会し、__kind__を使用してすべての種類を照会します。 package:gcloudには、この目的のために既に特別なKindNamespaceが含まれています。

その他のメタデータの種類は、種類カウントを照会するために、ユーザーが定義することができます。ここで

は、1つのダーツのエンティティをカウントすることを可能にするスニペットです:

import 'dart:async'; 

import 'package:appengine/appengine.dart'; 
import 'package:gcloud/db.dart'; 

Future main(List<String> args) async { 
    await withAppEngineServices(() async { 
    print(await getStats('Package')); 
    print(await getStats('PackageVersion')); 
    }); 
} 

Future<Stats> getStats(String kind) async { 
    final query = dbService.query(Stats)..filter('kind_name =', kind); 
    final Stats stats = (await query.run().toList()).first; 
    return stats; 
} 

@Kind(name: '__Stat_Kind__', idType: IdType.String) 
class Stats extends ExpandoModel { 
    @StringProperty(propertyName: 'kind_name') 
    String kindName; 

    @IntProperty() 
    int count; 

    String toString() => 'Stats(kind: "$kindName", count: $count)'; 
} 
+2

それは、データストア統計(一日一回?)ではなく、定期的に生成され、リアルタイムではないことを明確に/言及する価値があるかもしれません。リアルタイムカウントが必要な場合は、ユーザーが追加/削除されたときに更新される個別のカウンターを使用する必要があります。 –

+1

データストアエミュレータで統計情報を使用できるかどうか –

関連する問題