0

我正在同步來自NDB的數據。Google App Engine - NDB - 反轉IN的最佳方式(列表)

如何最好地對所有元素進行查詢,但不包括已發現的所有元素列表 - 基本上反轉了IN(列表)操作。

僞例如:

found = [] 
for ele in getElementList(): 
    ndb_data = ndb.get(ele) 
    if ndb_data.is_same_as(ele): 
    update(ele) 
    found.append(ndb_data.key) 
    else: 
    delte(ele) 
for ele in remaining(found): 
    create(ele) 

def remaining(found_list): 
    all = Element.query().fetch() 
    do_not_want = Element.query(Element.key.IN(found_list)).fetch() 
    for ele in all: 
    if ele in do_not_want: 
     all.remove(ele) 
    return all 

換言之,可以將剩餘的功能(found_list)只需辛格運河進行取 - 不是兩個一個完整的循環?

+0

難道你不能簡單地反轉你的* found_list *嗎?另外,儘量不要使用'all'作爲變量,因爲它是一個Python內置的 – Anzel

+0

http://stackoverflow.com/questions/20305163/in-ndb-how-to-query-for-items-where-property-a的副本-is-not-in-list-b –

回答

1

通過構建一系列的NDB過濾器,我們可以模擬一個 'NOT IN' 查詢 'X = Y和X = Z!':如(1):

checkList = ['cookieAck', 'newkey', 'tempCelsius'] 
query = UserSetting.query(Setting.name!=checkList[0]) 
for check in checkList[1:]: 
    query = query.filter(ndb.AND(UserSetting.name!=check)) 

settings = query.fetch() 

實際上,這看起來像以下手動構建的查詢(2):

query = UserSetting.query(ndb.AND(ndb.AND(UserSetting.name!='cookieAck', UserSetting.name != 'newkey'), UserSetting.name != 'tempCelsius')) 

注意,簡單地執行以下操作中也可以(3):

query = UserSetting.query(UserSetting.name!='cookieAck', UserSetting.name != 'newkey', UserSetting.name != 'tempCelsius') 

RES ulting查詢:

Query(kind='UserSetting', filters=OR(AND(FilterNode('name', '<', 'cookieAck'), FilterNode('name', '<', 'newkey'), FilterNode('name', '<', 'tempCelsius')), AND(FilterNode('name', '<', 'cookieAck'), FilterNode('name', '<', 'newkey'), FilterNode('name', '>', 'tempCelsius')), AND(FilterNode('name', '<', 'cookieAck'), FilterNode('name', '>', 'newkey'), FilterNode('name', '<', 'tempCelsius')), AND(FilterNode('name', '<', 'cookieAck'), FilterNode('name', '>', 'newkey'), FilterNode('name', '>', 'tempCelsius')), AND(FilterNode('name', '>', 'cookieAck'), FilterNode('name', '<', 'newkey'), FilterNode('name', '<', 'tempCelsius')), AND(FilterNode('name', '>', 'cookieAck'), FilterNode('name', '<', 'newkey'), FilterNode('name', '>', 'tempCelsius')), AND(FilterNode('name', '>', 'cookieAck'), FilterNode('name', '>', 'newkey'), FilterNode('name', '<', 'tempCelsius')), AND(FilterNode('name', '>', 'cookieAck'), FilterNode('name', '>', 'newkey'), FilterNode('name', '>', 'tempCelsius')))) 

注:我也更新了上面鏈接的問題。

+0

如果循環〜40次,此解決方案可能會投出「超出軟專用內存限制」。 –

相關問題