首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gaelyk:如何对集合属性执行数据存储查询

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

Stack Overflow用户
提问于 2011-02-05 08:35:29
回答 3查看 1.5K关注 0票数 5

Gaelyk tutorial为数据存储提供了一些很好的低级包装器,this Gaelyk google groups article描述了一种简单的关系建模方法,只需将键存储在实体上的集合中即可。

我的问题是如何对集合中的值执行查询?下面是一些示例代码来说明...

代码语言:javascript
复制
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‘查询的功能?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-03 02:14:19

回答只是为了方便以后登陆这个页面的用户:

Query.FilterOperator.EQUAL还将在键列表中查找(在列表的情况下,它的工作方式与CONTAINS相同)。所以现在你的第二个例子看起来像这样:

代码语言:javascript
复制
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"

并且断言通过:)

乍一看,这看起来很奇怪,但它确实是DataStore的一个很好的特性。

票数 6
EN

Stack Overflow用户

发布于 2011-02-06 04:09:59

要做到这一点,一种方法是将作者键作为实体"Book“中的一个字段。因此,您可以先查询该书,然后再获取其作者。

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2011-08-31 15:23:09

顺便提一下,关于这个主题的一点更新:你可能想看看最近发布的Gaelyk1.0的新的查询DSL特性。

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

这应该会简化很多针对数据存储的查询。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4904292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档