2009-07-25 10 views
5

私は以下のモデルを持っています。別のareaの値をすべて取得したいと思います。 SQLの同等のは、私はPythonで私はGoogle App Engineで私のモデルの別の値を取得する方法

a = ['google.com', 'livejournal.com', 'livejournal.com', 'google.com', 'stackoverflow.com'] 
b = set(a) 
    b 
    >>> set(['livejournal.com', 'google.com', 'stackoverflow.com']) 

を行うことができますことを知っているしかし、それは別のリストへのクエリのうち、面積のアイテムを移動する私を必要とし、そのリストに対してセットを実行しているでしょうselect distinct area from tutorials

class Tutorials(db.Model): 
    path = db.StringProperty() 
    area = db.StringProperty() 
    sub_area = db.StringProperty() 
    title = db.StringProperty() 
    content = db.BlobProperty() 
    rating = db.RatingProperty() 
    publishedDate = db.DateTimeProperty() 
    published = db.BooleanProperty() 

です(非常に非効率的な音)とデータストアの位置1001にある別個のアイテムがある場合、私は1000のフェッチ制限のためにそれを表示しませんでした。

私はデータストア内の領域のすべての別の値を取得したいと思いますそれをlに画面にダンプするインク。

答えて

7

Datastoreでは、1回のクエリでこれを行うことはできません。データストア要求は常にインデックスから連続した結果ブロックを返し、インデックスは常に、指定された注文に応じてソートされた、指定されたタイプのすべてのエンティティで構成されます。 1つのフィールドに値が重複しているだけなので、クエリが項目をスキップする方法はありません。

1つの選択肢は、データを再構成することです。例えば、「エリア」を表す新しいエンティティタイプを導入する。チュートリアルを追加すると、対応する「領域」がまだ存在しない場合は作成され、同じ「領域」が残っているチュートリアルがない場合は、Tutoralを削除すると対応する「領域」が削除されます。その領域にチュートリアルの数が格納されている場合は、トランザクションに一貫性のあるものを維持することは実際には非常に面倒なものになりますが、これはあまり面倒ではないかもしれません。エンティティのキ​​ーは領域文字列自体に基づいている可能性があります。つまり、領域エンティティを取得するためのクエリではなく、常にキー参照を行うことができます。

また、キューに入れられたタスクまたはcronジョブを使用して、すべての領域のリストを定期的に作成し、必要に応じて複数の要求に累積し、結果をデータストアまたはmemcacheに格納することもできます。もちろん、時にはエリアのリストが時代遅れになる可能性があります(または、一定の変更があった場合、それはまったく最新ではないかもしれません)。これはあなたに受け入れられるかもしれません。

最後に、チュートリアルと比較して非常に少ない領域がある場合は、最初のチュートリアル(領域別にソート)をリクエストして、その領域を超える領域を持つ最初のチュートリアルを要求することで、最初の、というように。しかし、これは別個の領域ごとに1つの要求を必要とするので、高速である可能性は低い。

+0

よろしいですか?私は「私が知る限りで」ビットを個人的に削除します。 :) –

+0

あなたの答えをありがとう。私は再構成の考えをするかもしれないと思う。私もそれを行うことができるいくつかのあいまいな方法があることを望んでいた – AutomatedTester

0

This has been asked beforeであり、結論はセットを使用することが良いということでした。

+0

質問には、結果をフィルタリングするためにPythonを使用する方法がありました。ここでの質問は、1001以上のチュートリアルがある場合を考慮したいため、単一のクエリでは返すことができません。 –

1

DISTINCTキーワードは、リリース1.7.4で導入されました。

関連する問題