Gaelyk:如何对集合属性执行数据存储查询

Chr*_*ris 5 groovy google-app-engine gaelyk google-cloud-datastore

Gaelyk教程提供了一些很好的低水平包装的数据存储,这Gaelyk谷歌组文章介绍了一种简单的方式通过简单地存储在实体集合中的钥匙,关系建模.

我的问题是如何对集合中的值执行查询?以下是一些示例代码以澄清......

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"
Run Code Online (Sandbox Code Playgroud)

如何创建在实体的集合属性中搜索匹配项的查询?即如何重新创建上面神话'FilterOperator.CONTAINS'查询的功能?

kda*_*bir 6

仅为了将来登陆此页面的用户而回答:

Query.FilterOperator.EQUAL也会在键列表中找到(在列表的CONTAINS情况下,它可以工作).所以现在你的第二个案例如下:

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"
Run Code Online (Sandbox Code Playgroud)

并且断言通过:)

这看起来可能很奇怪,但它确实是DataStore的一个很棒的功能.