1

我想了解Google Datastore是否可以滿足我的需求。如何對Google數據存儲中的很多實體執行總計?

我有很多實體,我需要對某個屬性執行一筆款項。 基本上,我希望能夠做select count(value1) from entity1 where [some filter],entity1是一個實體,用於跟蹤其字段/屬性value1中的某種數據。

我知道這些功能在數據存儲中不可用,因爲它不是關係數據庫,所以最直接的解決方案是執行select,然後計算應用程序中結果集的總和。所以,我有這樣的事情(使用的NodeJS,但我不關心語言):

query = client.query(kind='Task') 
query.add_filter('done', '=', False) 
results = list(query.fetch()) 

total = 0 
for(v in results) 
    total += v.value 

的問題是,我有成千上萬的記錄,所以結果可能會像30萬分的記錄。

這樣做沒有遇到瓶頸的最佳方法是什麼?

+0

第一個問題,你有多少次這樣做。其次,任務「完成」狀態的更新頻率如何?這兩個數字都會影響您採取的方法。例如遞增計數,或者只是批量。如果你已經計算了一次,它需要再次計數? –

+0

讀取操作(即請求數據總和的操作)經常發生。 '完成'只是爲了舉一個例子。 計數可能需要重新進行。 –

+0

如果你只是偶爾做這個事情,你的意思是瓶頸?你關心總體執行時間來完成這個總和嗎?我估計總計30萬條記錄大約需要2-5分鐘。 –

回答

1

您可以將總和存儲在單獨的實體中。無論用戶多頻繁地請求它,您都可以在幾毫秒內將其返回。

當總共包含的實體發生變化時,您更改總體實體。例如,如果某個屬性從300更改爲500,則總數將增加200.這樣,您的總數總是準確的。

如果更新非常頻繁,則可以將這些更新作爲任務(Task Queue API)實施,以防止競爭條件。這些任務將很快執行,因此您的用戶在每次詢問時都會得到非常「新鮮」的總數。

0

也許最好的方法來指望谷歌數據存儲是官方解決方案:Shard Count

相關問題