0

問題: ユーザー (B) は、特定の基準に基づいて一連のユーザー (A) からの支援を必要としています。この基準は、ユーザー (A) がプロファイルで設定します。

class UsersAProfiles(db.Model):
    industries = db.StringListProperty()  #technology, etc. (total 20)
    agegroups  = db.StringListProperty()  #teenagers, etc. (total 10)
    tags       = db.StringListProperty()  #cooking, etc.
    (while each User A can enter at most 10 tags, but there is no limit on 
     what tags are used, e.g., sql, gym, etc. (limited by dictionary!)
    ...                                   #there are many other properties

ユーザー (B) は、個別に保存されている基準を設定します

class UserBRequestForHelp(db.Model):
    myindustries = db.StringListProperty()  #technology, etc. (<20)
    myagegroups  = db.StringListProperty()  #teenagers, etc. (<10)
    mytags       = db.StringListProperty()  #cooking, etc.
    ...                                     #there are many other properties

ここで、B を助ける可能性のあるすべてのユーザー A のリストが必要です。そのために、次のクエリを実行してみます。

query = db.GqlQuery("SELECT * FROM UsersAProfiles WHERE 
        industries IN :1 AND 
        agegroups  IN :2 AND
        tags       IN :3", 
        userB_obj.myindustries , userB_obj.myagegroups, userB_obj.mytags)

しかし、次のエラーが表示されます。

  Cannot satisfy query -- too many IN/!= values.

私は本当にここで立ち往生しており、この問題を解決する方法がわかりません。そのようなクエリを実行する方法。さらに、そのようなクエリを実行できるように、モデル クラスを別の方法で設計する必要がありますか? もしそうなら、誰か助けてください。

事前にたくさんありがとう!

4

2 に答える 2

0

IN を使用してクエリを作成する場合、GAE はそのクエリをいくつかの "index = value" サブクエリに分割し、それぞれを実行して、1 つの検索であるかのようにそれらを組み合わせた結果を収集する必要があります。クエリが展開できるサブクエリの数には制限があり、その制限は 30です。31 個のサブクエリを使用してクエリを作成している場合、これが発生する理由が説明されます。つまり、あなたの状況は len(userB_obj.myindustries) + len(userB_obj.myagegroups) + len(userB_obj.mytags) > 30 です。

于 2013-02-11T18:10:58.300 に答える
0

上記のような問題の場合、次のアプローチが役立つ場合があります。

  1. 一致するすべての UserA プロファイルのリストを使用して、別のモデルに TAGS をリストします。

    class TAGS(db.Model):
        UserAIds  = db.StringListProperty() 
    

    上記では、各タグがキーです。(タグ = テクノロジー、10 代、料理など)

  2. ユーザー B が条件を設定し、一致するユーザー A を見つけるために実行できるクエリは次のとおりです。

    i = 0
    for industry in userB_obj.myindustries:
          t1_obj[i] = TAGS.get_by_key_name(industry)
          i = i + 1
    

    (上記の t1_obj[i] には、一致する業界を持つユーザー A プロファイルのリストがあります)

    j = 0
    for agegroup in userB_obj.myagegroups:
          t2_obj[j] = TAGS.get_by_key_name(agegroup)
          j = j + 1
    

    (上記の t2_obj[j] には、一致する年齢層を持つユーザー A プロファイルのリストがあります)

    k = 0
    for tag in userB_obj.mytags:
          t3_obj[k] = TAGS.get_by_key_name(tag)
          k = k + 1
    

    (上記の t3_obj[k] には、一致するタグを持つユーザー A プロファイルのリストがあります)

  3. 次に、t1_obj、t2_obj、t3_obj の 3 つすべてに存在する UserA プロファイルを見つけるだけです。上記の 3 つすべてに存在する UserA プロファイルを見つけるには、それを実行できる python 関数があるかどうかはわかりません。ただし、モデル インスタンスを使用すると、次のように解決できます。

    class MatchingUserAs(db.Model):
          count  = db.IntegerProperty(default=0) 
          source = db.StringProperty(default=None)
    

    (上記のモデルクラスでは、UserAid がキーです。この UserAid は t1_key[i].UserAIds、t2_key[j].UserAids、t3_key[k].UserAIds に格納されます)

  4. ここで、t1_obj[i]、t2_obj[j]、t3_obj[k] をループして、MatchingUserAs に UserA id を挿入し、行を挿入/更新するたびにカウントを 1 増やします。

    <"loop through t1_obj[i]">:
          Matchkey = MatchingUserAs.get_or_insert(t1_obj[i].UserAId)
          Matchkey.count = 1
          Matchkey.source = 'industry'
          Matchkey.put()
    
    <"loop through t2_obj[j]">:
          Matchkey = MatchingUserAs.get_or_insert(t2_obj[j].UserAId)
          #the following if check has been added to avoid incrementing the counter
          #when same UserAid is present in, say, t2_obj[0], and t2_obj[1], etc.
          if(Matchkey.source != 'agegroup')
              Matchkey.count  = Matchkey.count + 1
              Matchkey.source = 'agegroup'
          Matchkey.put()
    
    <"loop through t3_obj[j]">:
          Matchkey = MatchingUserAs.get_or_insert(t3_obj[j].UserAId)
          if(Matchkey.source != 'tags')
              Matchkey.count  = Matchkey.count + 1
              Matchkey.source = 'tags'
          Matchkey.put()
    
  5. ここで必要なことは、MatchingUserAs からそれらの UserAs をカウント 3 で取得することだけです (一致させたいタグのリストが 3 つあるためです: 業種、年齢層、およびタグ)。

上記のコード サンプルには、特にキーとオブジェクトの使用に関して、いくつかの構文エラーがある可能性があります。また、場合によっては疑似コードが使用されています。ソリューションの概要を説明したかっただけです。お役に立てれば。コメントをお気軽に共有してください。

于 2013-02-11T20:19:44.333 に答える