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 をカウントしません。したがって、私の場合、なぜ間違った結果が返されるのかわかりません。
コメント、アイデアは大歓迎です..