Google app engine 在googleappengine中使用GQL实现连接查询

Google app engine 在googleappengine中使用GQL实现连接查询,google-app-engine,join,gql,Google App Engine,Join,Gql,我有一种实体,比如: prop1 prop2 docid其他属性 str1 p1 1001 str2 p1 1002 str2 p2 1001 str1 p2 1003 我想让所有那些文档ID都有“prop1作为str1,prop2作为p1”和“prop1作为str2,prop2作为p2”的共同点,并希望使用它们的其他属性。这里的答案是docid 1001。有人能给我一个这样做的方法吗?如果需要,我甚至准备更改我的数据库结构,但我希望这些事情只通过一个查询完成 好的,其他属性没问题,我可能不需要

我有一种实体,比如:

prop1 prop2 docid其他属性

str1 p1 1001

str2 p1 1002

str2 p2 1001

str1 p2 1003

我想让所有那些文档ID都有“prop1作为str1,prop2作为p1”和“prop1作为str2,prop2作为p2”的共同点,并希望使用它们的其他属性。这里的答案是docid 1001。有人能给我一个这样做的方法吗?如果需要,我甚至准备更改我的数据库结构,但我希望这些事情只通过一个查询完成

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

现在我用的是这样的东西:

对于db.GqlQuery中的b(“从b中选择*):
对于db.GqlQuery中的一个查询(“从其中y=:1,b.y中选择*):
打印a.x


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

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

class Doc(db.Model):
  strings = db.StringListProperty()
然后,您可以查询该列表中的多个字符串,如下所示:

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

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

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

class Doc(db.Model):
  strings = db.StringListProperty()
然后,您可以查询该列表中的多个字符串,如下所示:

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

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

我不确定您的要求。为什么不澄清这个问题并包含一些代码,比如实际的模型定义。您可能会发现一些有用的资源:,和。我有一个具有多个属性的实体,如prop1、prop2等。。。还有一个医生。现在我想搜索所有那些包含组合“prop1为“str1”,prop2为“p1”,prop1为“str2”,prop2为“p2”的docid。我不确定你在问什么。为什么不澄清这个问题并包含一些代码,比如实际的模型定义。您可能会发现一些有用的资源:,和。我有一个具有多个属性的实体,如prop1、prop2等。。。还有一个医生。现在,我想搜索所有包含组合“prop1为“str1”,prop2为“p1”,prop1为“str2”,prop2为“p2”的文档ID。这不起作用,因为我的筛选条件不依赖于单个属性。谢谢你的回复。@user617462根据你对问题的描述,尼克的解决方案在我看来是合理的。如果它“不起作用”,您应该更详细地解释为什么,并进一步澄清您的问题。@user617462如果您在文档上定义单独的属性,同样的方法也会起作用。无论如何,你应该搜索文档,而不是创建一个“docjoin”。@Robert,@Nick:当我应该查询一个或两个相同类型的属性时,你的方法很有效,但我的问题是,查询属性可能不同。就像我可能想找到所有这些文档与“prop1作为str1”和那些“prop1作为str2和prop2作为p1”的文档一样。我认为在这种情况下这是行不通的。无论如何,谢谢你的建议,但如果你现在能帮助我,那就太好了。@user617462你可以使用
Doc.all().filter('prop1','str1')。filter('prop2','str2')。get()
(当前)没有本机
,所以你必须运行两个查询来获取带有“prop1='str'或(prop1='xyz'和prop2='other')”的文档。”。这不起作用,因为我的筛选条件不依赖于单个属性。谢谢你的回复。@user617462根据你对问题的描述,尼克的解决方案在我看来是合理的。如果它“不起作用”,您应该更详细地解释为什么,并进一步澄清您的问题。@user617462如果您在文档上定义单独的属性,同样的方法也会起作用。无论如何,你应该搜索文档,而不是创建一个“docjoin”。@Robert,@Nick:当我应该查询一个或两个相同类型的属性时,你的方法很有效,但我的问题是,查询属性可能不同。就像我可能想找到所有这些文档与“prop1作为str1”和那些“prop1作为str2和prop2作为p1”的文档一样。我认为在这种情况下这是行不通的。无论如何,谢谢你的建议,但如果你现在能帮助我,那就太好了。@user617462你可以使用
Doc.all().filter('prop1','str1')。filter('prop2','str2')。get()
(目前)没有本机
,所以你必须运行两个查询来获取带有“prop1='str'或(prop1='xyz'和prop2='other')”的文档。