0

どのユーザーが誰をフォローしているかを示すアクティビティ テーブルがあります。(fromUserおよびtoUser) フォロワーの中で誰が最も多くの評価を投稿したかを確認するリーダーボードを作成しています。

だから私はこのクエリを作成しました:

ParseQuery<ParseObject> queryActivityFollowing = new ParseQuery<>("Activity");
queryActivityFollowing.whereEqualTo("type", "follow");
queryActivityFollowing.whereEqualTo("fromUser", ParseUser.getCurrentUser());
queryActivityFollowing.setLimit(500);

// innerQuery, only get Users posted by the users I follow
ParseQuery<ParseUser> queryUserFollowing = ParseUser.getQuery();
queryUserFollowing.whereMatchesQuery("toUser", queryActivityFollowing);

// querySelf
ParseQuery<ParseUser> querySelf = ParseUser.getQuery();
querySelf.whereEqualTo("objectId", ParseUser.getCurrentUser().getObjectId());

List<ParseQuery<ParseUser>> queries = new ArrayList<>();
queries.add(queryUserFollowing);
queries.add(querySelf);

query = ParseQuery.or(queries);
query.orderByDescending("rating_count");
query.setLimit(20);

しかし、どういうわけか、タイムアウトして結果が表示されません。私のクエリで非効率的なものはありますか?

ありがとう!

編集: データの説明: は、 、、 のActivity3 つの列を持つクラスです。クラスへのポインタであり、文字列ですfromUsertoUsertypefromUsertoUser_Usertype

には、従来の属性と、 orderBy 基準である_Userという名前の整数があります (上記の更新されたコード)。rating_count

実際、クエリはタイムアウトしないと思いますが、結果は 0 です。私は何人かのユーザーをフォローしているので、それは間違いなく期待される出力ではありません.

4

2 に答える 2

1

データ モデルを変更したい場合は、必要なものが得られるソリューションと、いくつかの副次的な利点があります。User クラスがアプリと実在の人物との関係のみに関連するシステムを考えてみましょう。ユーザー同士の公開面は、新しいクラス (PublicUser または Persona と呼びます) によって提示されます。

このPublicUserクラスには、それを所有するへのポインタと、この が である他のへのポインタの配列があります。このクラスには属性も含まれます。OPのクエリは簡単です:userPublicUserfollowingrating

  1. query PublicUser whereKey "following" equals currentUser
  2. 評価順、制限は 20 または制限したい任意の数

それでおしまい。この方式のもう 1 つの利点は、アクセス制御です。システムは、PublicUser 内のすべてが他の PublicUser に読み取り可能であることを認識し、__User に関するすべてがその個人とアプリの間で保持されます。

于 2015-05-25T20:55:27.427 に答える