5

Gaelykチュートリアルは、データストアにいくつかの優れた低レベルラッパーを提供します。このGaelyk googleグループの記事では、エンティティのコレクションにキーを保存するだけで、関係をモデル化する簡単な方法について説明しています。

私の質問は、コレクション内の値に対してクエリを実行するにはどうすればよいですか?明確にするためのサンプルコードを次に示します...

def b1 = new Entity("Book")
b1.title = "Book1"
b1.save()

def b2 = new Entity("Book")
b2.title = "Book2"
b2.save()

def author1 = new Entity("Author")  
author1.books = [b1.key, b2.key]
author1.name = "Chris"
author1.save()

// It is easy to simply query the Author entity for a standard string property
def query = new Query("Author")
query.addFilter("name", Query.FilterOperator.EQUAL, "Chris")
PreparedQuery preparedQuery = datastore.prepare(query)
def authors = preparedQuery.asList(withLimit(1))
assert authors[0].name == "Chris"

// But I can't find out how to query a collection property eg books on the Author entity
def query2 = new Query("Author")
// I would like to do something to return the entity if the value is in the collection property
// eg if there could be something like 'CONTAINS' criteria ...
// Unfortunately Query.FilterOperator.CONTAINS doesn't exist...
query2.addFilter("books", Query.FilterOperator.CONTAINS, b2.key)
PreparedQuery preparedQuery2 = datastore.prepare(query2)
def authors2 = preparedQuery2.asList(withLimit(1))
assert authors2[0].name == "Chris"

エンティティのコレクションプロパティ内で一致を検索するクエリを作成するにはどうすればよいですか?つまり、上記の神話上の「FilterOperator.CONTAINS」クエリの機能を再現する方法は?

4

3 に答える 3

6

将来このページにアクセスするユーザーのためだけに回答する:

Query.FilterOperator.EQUALキーのリスト内にもあります(CONTAINSリストの場合は、として機能します)。したがって、2番目のケースは次のようになります。

def query2 = new Query("Author")
query2.addFilter("books", Query.FilterOperator.EQUAL, b2.key)
PreparedQuery preparedQuery2 = datastore.prepare(query2)
def authors2 = preparedQuery2.asList(withLimit(1))
assert authors2[0].name == "Chris"

そしてアサーションは通過します:)

これは一見奇妙に見えるかもしれませんが、確かにデータストアの優れた機能です。

于 2011-08-02T18:14:18.827 に答える
3

これを行う1つの方法は、エンティティ「Book」のフィールドの1つとして作成者キーを使用することです。したがって、最初に本を照会してから、その本の著者を取得できます。

def author1 = new Entity("Author")  
author1.name = "Chris"
author1.save()

def b1 = new Entity("Book")
b1.title = "Book1"
b1.authors = [author1.key]
b1.save()

author1.books = [ b1.key ]
author1.save()

def book = datastore.get(b1.key)    
def chrisAuthors = book.authors.findAll { authorKey -> datastore.get(authorKey).name == 'Chris' }
assert chrisAuthors.size() == 1
于 2011-02-05T20:09:58.813 に答える
2

ちなみに、このトピックに関するちょっとした更新:最近リリースされたGaelyk1.0の新しいQueryDSL機能を見てみたいと思うかもしれません。

http://gaelyk.appspot.com/tutorial/app-engine-shortcuts#query

これにより、データストアに対して実行できる多くのクエリが簡素化されます。

于 2011-08-31T07:23:09.363 に答える