2014-10-03 116 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