【问题标题】:Implementing join query using GQL in google-app-engine在 google-app-engine 中使用 GQL 实现连接查询
【发布时间】:2011-03-23 05:44:05
【问题描述】:

我有一个类似的实体:

prop1 prop2 docid 其他属性

str1 p1 1001 ....

str2 p1 1002 .........

str2 p2 1001 .........

str1 p2 1003 ....

我想拥有所有具有“prop1 as str1 and prop2 as p1”和“prop1 as str2 and prop2 as p2”的文档,并希望使用它们的其他属性。像这里一样,答案将是 docid 1001。任何人都可以建议我这样做的方法吗?如果需要,我什至准备更改我的数据库结构,但我希望这些事情只通过单个查询来完成......

好吧,我可能不需要使用它们的其他属性,我只想要所有常见的 docid。

现在我正在使用这样的东西:

for b in db.GqlQuery("SELECT * FROM b"):
for a in db.GqlQuery("SELECT * FROM a WHERE y=:1", b.y):
打印 a.x

但这需要很多时间,因为我有大量的条目。

【问题讨论】:

  • 我不太确定你在问什么。您为什么不澄清问题并包含一些代码,例如您的实际模型定义。一些您可能会觉得有帮助的资源:@​​987654321@、code.google.com/appengine/articles/modeling.htmlgoogle.com/events/io/2009/sessions/…
  • 我有一个具有多个属性的实体,如 prop1、prop2 等......和一个 docid。现在,我想搜索所有将 'prop1 as "str1" 和 prop2 as "p1"' 和 'prop1 as "str2" 和 prop2 as "p2"' 组合的 docid。

标签: google-app-engine join gql


【解决方案1】:

对此进行建模的最简单方法是让文档本身有一个字符串列表:

class Doc(db.Model):
  strings = db.StringListProperty()

然后,您可以像这样查询该列表中的多个字符串:

q = Doc.all().filter('strings =', 'str1').filter('strings =', 'str2').get()

这将默认使用合并连接策略,因此不需要您构建任何自定义索引。

【讨论】:

  • 这不起作用,因为我的过滤条件不依赖于单个属性。感谢您的回复。
  • @user617462 根据您对问题的描述,尼克的解决方案在我看来是合理的。如果它“不起作用”,您应该更详细地解释原因并进一步澄清您的问题。
  • @user617462 如果您在文档上定义单独的属性,同样的方法也适用。在任何情况下,您都应该搜索文档,而不是创建“docjoin”。
  • @Robert,@Nick:当我应该查询一个或两个相同类型的属性时,您的方法效果很好,但这里我的问题是查询属性可能不一样。就像我可能想找到所有那些“prop1 as str1”和“prop1 as str2 and prop2 as p1”共同的文档。而且我认为这在这种情况下不会起作用。不管怎样,谢谢你的建议,但如果你现在能帮助我就好了..
  • @user617462 你可以使用Doc.all().filter('prop1', 'str1').filter('prop2', 'str2').get() (目前)没有原生OR,所以你必须运行两个查询来获取带有“prop1 = 'str' OR (prop1 = 'xyz' AND prop2 = '其他')"。
猜你喜欢
  • 1970-01-01
  • 2013-10-13
  • 2014-03-02
  • 2012-07-23
  • 2015-12-22
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
相关资源
最近更新 更多