1

Google アプリ エンジンの高レプリケーション データストアのプロジェクション プロパティの個別のカウントを取得しようとしています。私のモデルの一部は次のようなものです:

class Hit(ndb.Model):
  accountId = ndb.StringProperty(indexed=True)
  sessionId = ndb.StringProperty(indexed=True)
  pageId = ndb.StringProperty(indexed=True)

したがって、モデルは、異なるセッションからのページへのすべてのヒットを保存します。必要なのは、特定のアカウント ID に対して 2 つの特定のページ ID のうち少なくとも 1 つを持つ個別のセッションの数です。

私の希望するクエリは次のようなものです:

Hit.query(ndb.AND(Hit.accountId == "acct1", ndb.OR(Hit.pageId == "page1", Hit.pageId == "page2")), projection=['sessionId'], distinct=True).count()

しかし、これは例外を返します: BadRequestError: cannot specify group_by without a project

ということで、以下のようにしてみました。

len(Hit.query(ndb.AND(Hit.accountId == "acct1", ndb.OR(Hit.pageId == "page1", Hit.pageId == "page2")), projection=['sessionId'], distinct=True).fetch())

残念ながら、このクエリは重複した「sessionId」をカウントします! (つまり、個別の値を返しません) たとえば、以下のエンティティの場合:

accountId    sessionId     pageId
---------    ---------     ------
acct1        sess1         page1
acct1        sess1         page2

「1」の結果が得られることを期待していますが、個別のセッション ID の数を取得しようとしているにもかかわらず、クエリは「2」を返します。set() を使用して重複する sessionId をフィルタリングできることはわかっていますが、その場合、すべての結果を反復処理する必要があり、エンティティの数が非常に多いため、これは望ましくありません。これは GAE では実行できないという投稿を見てきました。ええと、これは私にとって非常に奇妙です。

Hit.pageID == "<page_id>" 

上記のクエリのステートメント、それは正常に機能し、期待どおりに重複するセッション ID をカウントしません。したがって、私の場合、なぜ間違った結果が返されるのかわかりません。

コメント、アイデアは大歓迎です..

4

1 に答える 1

0

.count() は返されたエンティティの数のみを返し、pageId が異なる場合は個別のエンティティがあるため、すべてが設計どおりに動作しているように見えます。

最善の方法は、おそらく、関心のあるカウントを保存し、ページがフェッチされたときにそのカウントを更新し、必要なときにそのカウントを具体的にクエリすることです。

それ以外の場合は、すべてのエンティティを解析し、カウントを手動で更新する必要があります。

于 2013-11-12T15:39:04.513 に答える