2014-10-03 77 views
0

使用GQL,可以对某个列表foo中的某个值具有某个属性的实体运行查询。“db.ListProperty CONTAINS foo”的GQL查询?

foo = ['a'] 
bar = MyModel.gql('WHERE bar IN :1', foo).get().bar 
bar == 'a' 
#False 
bar in 'a' 
#True 

我想要做的就是这样的逆:请问db.ListPropertybarfoo,包含值foobar

喜欢的东西:

foobar = 'a' 
barfoo = MyModel.gql('WHERE barfoo CONTAINS :1', foobar).get().barfoo 
barfoo == 'a' 
#False 
'a' in barfoo 
#True 

这可能吗?如果不是,我怎样才能合理有效地复制这种行为?

作为一个扩展,如果我能看到列表foo中的任何一个是否在列表属性bar中,它会更好。例如如果bar == ['a', 'b', 'c']然后我可以查询它对['a', 'y', 'z'],并返回它,因为它确实匹配'a'

+0

您的查询是“是”列表中的值之一“或”做任何列表中的值包含'a'“? – 2014-10-03 15:59:10

+0

@DanielRoseman“是列表项目之一''a''” – OJFord 2014-10-03 16:00:46

+0

它似乎是通过'.filter('listproperty','singleitem')'实现的,但它不是*可能做到这一点“对于列表中的任何内容“,我只通过在for循环中包装来管理它。如果仍然有这个gql查询字符串,仍然感兴趣。 – OJFord 2014-10-03 16:03:42

回答

1

对于搜索的重复属性内的文字值,你只需要使用普通=

MyModel.gql('WHERE barfoo = :1', foobar) 

,并为“在任何此列表中的ListProperty的”,你可以使用完全相同的IN作为您的原始查询。请注意,尽管IN在GAE数据存储中通常非常低效。 (注意,使用GQL而不是db/ndb API没有任何好处,它不能做任何这些API不能做的事情,事实上这些语句被转换为完全相同的底层远程过程呼叫。)

+0

哦,快点,认真吗?!所以如果'ent.barfoo == [1,2]'和'foobar == 1',那么'ent'就是结果? – OJFord 2014-10-03 16:07:35

+0

@OllieFord是的。按照我的理解,重复的实体实际上“扁平化”了索引表中的重复实体,创建了多个条目(一个条目的“ent”和“barfoo = 1”以及一个条目的“ent”和“barfoo = 2” ,它可以让你直接查询它们Daniel可能会纠正我,尽管 – Patrice 2014-10-03 16:08:45

+0

@Julldar这是否意味着如果一个'db.ListProperty'将具有已知的常量大小'x',具有'x'属性便宜,以避免重复其他 - 但是大的'x'是? – OJFord 2014-10-03 16:10:30