2015-04-05 48 views
1

我是Google Datastore的新手。我正在構建一個簡單的應用程序,我想統計符合特定條件的實體數量。最明顯的方式做到這一點是首先查詢該實體,然後採取對結果計數:Google Appengine數據存儲區中的特定範圍內的實體計數

// Applying query on the "height" property of the entity "Person 
Filter heightFilter = new FilterPredicate("height", 
        FilterOperator.GREATER_THAN_OR_EQUAL, 
        minHeight); 

// Use class Query to assemble a query 
Query q = new Query("Person").setFilter(heightFilter); 

// Use PreparedQuery interface to retrieve results 
PreparedQuery pq = datastore.prepare(q); 

// And now count. 

我想知道,這是開展這項特殊任務的最佳方式。查詢機制將遍歷這個特定實體的整個數據庫(在這種情況下爲Person)並逐一匹配它。如果我只需要計數而不是整個實體,有沒有更好的方法來做到這一點?

回答

2

數據庫不是爲這類查詢而設計的,計數很難擴展,因此我們鼓勵您爲您的特定需求提出解決方案。

在這種情況下,您可以使用一個模型來保持計數,並在每次添加/刪除Person時進行更新。然後爲了得到計數,您只需獲取一個實體並讀取計數,這對於讀取來說是完美的,快速且便宜。

現在的問題是寫入問題,因爲您希望以事務方式執行此操作(以保持準確的計數),您的應用程序中可能會有一段時間,每秒有超過1-5次更新,並且事務需要重試並可能成爲瓶頸。在這個階段一個流行的解決方案是使用Sharding counters,它將計數過程分佈在多個實體之間,因此吞吐量增加。

我會建議你保持簡單,只有在你真正需要時纔會採用更高級的技術,以控制複雜性。從來沒有數過,使用這種技術(非sql)的想法是在寫作時提前支付成本,因此讀取儘可能快速和高效。

+0

@ Pravesh耆那教的:有2個解決方案,通過它可以通過海梅即分片描述,另一個解決方案是實現應用程序中的計數器實體數量的條目。瀏覽鏈接[1]以獲得它的全貌。 [1] https://blog.svpino.com/2015/03/08/how-to-count-all-entries-of-a-given-type-in​​-the-app-engine-datastore – Shobhit 2015-04-06 17:50:46

-1

下面的代碼片段將只返回鍵而不是整個實體,只有鍵的查詢被認爲是「小操作」,因此速度更快,更重要...免費。

Query q = new Query("Person").setKeysOnly(); 
+0

I相信在這種情況下計數操作仍然是線性的(並且不是很好)。 – marcadian 2015-04-07 01:07:46

+0

@marcadian是的,不幸的是AFAIK沒有其他辦法。由於數據存儲體系結構的原因,擁有COUNT運算符並不可行。至少這樣,你不會爲每一個你計算的實體付費。 – jirungaray 2015-04-07 01:13:59

+0

這不解決問題只是使它更有效一些,但仍不會擴展。 – 2015-04-07 13:22:49

相關問題