2014-11-24 94 views
0

我有一個Rails應用程序。它具有顯示來自不同用戶的項目全部混合的提要。這將是類似Pinterest的方式,你看到這些項目。啓用隨機訪問與MongoDB收集

現在我顯示所有這些項目的創建日期排序。但是,由於這些項目是由用戶通過批量創建的,因此它們不會隨機顯示(例如,您選擇的前6項來自一個用戶,然後是其他5個來自其他用戶,等等)。

服務於項目的代碼是這樣的:

class Feeder 

    def self.most_recent_created(watching_user=nil, current_cursor) 

     next_cursor = nil 
     feed = [] 
     influencers_ids = User.influencers.distinct(:_id) 

     Rating.most_recent_from_influencers(watching_user, influencers_ids).scroll(current_cursor) do |rating, cursor| 
      next_cursor = cursor 
      feed << ImoPresenter.new(Imo.new(rating), watching_user) 
     end 

     feed << next_cursor.to_s 

    end 

end 

滾動只是給指着迭代每個項目的光標。然後我將物品推入飼料中。

到數據庫的訪問是在Rating.most_recent_from_influencers(watching_user,influencers_ids),其中most_recent_from_influencers(watching_user,influencers_ids)是被定義爲一個範圍進行如下:

scope :not_from, ->(user) { ne(user_id: user.id) } 
scope :from, ->(user_ids) { any_in(user_id: user_ids) } 
scope :most_recent_from_influencers, ->(watching_user, influencers_ids) { 
     proxy = from(influencers_ids).over_zero.desc(:created_at).limit(IMOS_PER_PAGE) 
     proxy = proxy.not_from(watching_user) if watching_user 
     proxy 
    } 

MongoDB中沒有出的隨機接入盒子。他們建議this有隨機訪問項目的方式。基本上,解決方案是在所有文檔中添加一個隨機字段,並通過此字段對集合進行排序。不過,儘管我會隨機購買物品,但我總是會顯示幾乎相同的物品,因爲我只能通過desc(:rand)asc(:rand)訂購它。

我想就如何以隨機的方式真正地顯示物品提出建議。可能嗎?

+0

爲什麼你不按ID的一些隨機組件排序,如秒,或者如果你有完整的時間戳存儲在對象中,然後毫秒......嗯我看到你正在處理潛在的完全相同的一組項目,你想隨機化他們 – 2014-11-24 09:45:00

+0

@AsyaKamsky,你將如何以毫秒爲單位在ObjectId。據我所知,你可以按字段名稱排序。 – borjagvo 2014-11-24 15:27:47

+0

你可以使用聚合框架來轉換任何字段(我剛剛意識到你還不能從聚合中的ObjectId中提取時間)。你的文檔中還有哪些其他字段? – 2014-11-24 16:50:23

回答

0

基於類似的問題,我得出的結論是,如果集合是動態的,意味着文檔被頻繁插入,那麼使用隨機字段是一個有效的解決方案。收藏越是動態,您可以擁有的「隨機」訪問就越多。