2014-09-25 33 views
0

我有一個用Python編寫的appengine項目。 我使用tags = ndb.StringProperty(repeated=True)的模型。Appengine - 帶有未知列表大小的ndb查詢

我想要的是,給定一個標籤列表,搜索列表中每個標籤的所有對象。 我的問題是該列表可能包含任何數量的標籤。

我該怎麼辦?

回答

2

當您對列表屬性進行查詢時,它實際上會在數據存儲級別創建一組子查詢。單個查詢可以產生的最大子查詢數爲30.因此,如果您的列表包含多於30個元素,則會發生異常。

爲了解決這個問題,你要麼必須改變你的數據庫模型,要麼根據你有的列表元素的數量創建多個查詢,然後合併結果。這兩種方法都需要由您的代碼處理。如果您需要列表中的所有標籤與模型中的列表屬性相匹配,那麼您可以創建基本查詢,然後在循環中追加AND運算符(如marcadian描述的那樣)。例如:

qry = YourModel.query() 
qry = qry.filter(YourModel.tags == tag[i]) for enumerate(tags) 

但是,正如我前面提到的,你應該小心模型中的列表屬性的長度和你的索引配置,以避免像指數爆炸問題。有關更多信息,你可以檢查:

+0

謝謝,這增加的另一件事,我不知道。但問題是不同的。正如我可以在這裏看到https://cloud.google.com/appengine/docs/python/ndb/queries,我可以擁有列表中至少有一個標籤的所有對象。但是我想要列表中包含所有標籤的對象。我不能第一個例子與列表[0],列表[1] ...列表[n],因爲我不知道n ... – andrew 2014-09-25 21:51:12

+0

我認爲你可以添加和過濾類似.filter(型號。標籤==標記[i])我在枚舉(標記) – marcadian 2014-09-26 01:08:07

+0

我對Python很新,我不明白這樣寫的代碼(它給了我'語法錯誤'),我是仍然在搜索一些關於它的文檔,但是如果我使用過濾器和「普通」的話,它確實有用,謝謝:) – andrew 2014-09-26 23:03:16