如何使用Objectify從Google App Engine數據存儲中獲取隨機元素?我應該獲取所有實體的密鑰並從中隨機選擇還是有更好的方法?從Objectify實體獲取隨機條目
回答
當您存儲它時,爲每個實體分配一個介於0和1之間的隨機數。要獲取隨機記錄,請生成另一個介於0和1之間的隨機數,然後查詢隨機值大於此值的最小實體。
您不需要全部取回。 例如:
- countall =查詢(X.class).Count之間() // http://groups.google.com/group/objectify-appengine/browse_frm/thread/3678cf34bb15d34d/82298e615691d6c5?lnk=gst&q=count#82298e615691d6c5
- RND =生成的隨機數[0..countall]
- ofy.query(X.class ).order(「 - date」)。limit(rnd); //例如-date或一些慢性索引字段
- 最後一個ID是你的... (平均你混帳50%或以免首先讀取平均爲50%以下)
改進(以在緩存中有更小的關鍵表)!
第一次閱讀後記住每個X元素。 Cache id -s及其位置。因此,下一次從選定ID進一步查詢條件(max「.limit(rnd%X)」將爲X-1)。
隨機只是隨機的,如果它不需要接近100%公平,推測慢性字段值(例如,如果您在10天內有1000條記錄,對於隨機501選擇第二個元素大於第五天) 。
其他選項,如果你有慢性場日期(或類似),取比隨機日期和年輕然後隨機日期+ 1(你需要知道的第一個日期和最後日期),舊的元素。第二次在取出的記錄之間選擇隨機數如果查詢爲空選擇比等更大......
從this post引用有關從物化數據存儲選擇一些隨機因素:
如果你的ID是連續的,一個辦法是隨機選擇5 號來自已知使用的id範圍。然後使用「in」filter()中的 查詢。
如果您不介意5個條目相鄰,您可以使用count(), limit()和offset()來隨機查找包含5個條目的塊。
否則,你可能需要使用限制(和偏移量),以 同時隨機選擇一個條目出來。
- 喬希
我非常適應提供Matejc的算法。然而,3件事情:
除了使用COUNT()或數據存儲服務工廠(DatastoreServiceFactory.getDatastoreService()),我有一個跟蹤我感興趣的實體總數的實體這種方法的原因是: a。b。在處理大量對象時,count()可能很昂貴。您不能在本地測試數據存儲服務工廠...在prod中進行測試只是一種不好的做法。
生成隨機數:ThreadLocalRandom.current()nextLong(1,maxRange)
而不是使用限制(),我使用偏移,所以我不擔心「排序。 「
- 1. 從集合中獲取隨機條目
- 2. 從Json String獲取隨機項目
- 3. 從目錄中隨機獲取圖像?
- 4. 從Firebase獲取隨機項目
- 5. Bookshelf - 從數據庫中獲取隨機條目
- 6. 從數據存儲中獲取一個隨機實體
- 7. 獲取隨機目錄
- 8. 從詞典獲取隨機項目?不是隨機的
- 9. SQL:獲取隨機條目iff條件爲假
- 10. 從Mysql獲取隨機值
- 11. SQL查詢獲得隨機條目
- 12. Objectify實體模型設計
- 13. 獲取包含特定值的實體 - objectify
- 14. 無法使用objectify獲取保存的實體
- 15. 從實體框架獲取項目ID
- 16. 移去X隨機條目從矢量
- 17. 獲取條件的隨機記錄
- 18. 無法將從交易中獲得的實體關聯到Objectify
- 19. 獲取基於類別的隨機條目
- 20. 如何從數據存儲中獲取一組唯一的隨機條目
- 21. 隨機從目錄
- 22. 從表格中獲取3條隨機記錄
- 23. 從SQLite數據庫中獲取10條隨機記錄
- 24. 獲得一個隨機的項目從
- 25. 從序列中提取隨機項目
- 26. 從實體獲取單列
- 27. 谷歌Objectify v4獲取ID
- 28. 如何隨機從數組中獲取
- 29. 從主中獲取隨機函數
- 30. 從arraylist中獲取一個隨機詞
不是一個壞主意,儘管它聽起來像我會創建一個索引僅僅是爲了選擇數據,這似乎是不幸的。我的表只會很少更新,所以我在考慮本地緩存鍵列表,然後隨機抓取一個鍵(避免額外的列/索引/查詢)。 –