使用MongoDB启用对集合的随机访问

时间:2014-11-24 08:50:16

标签: ruby-on-rails mongodb

我有一个Rails应用程序。它有一个Feed,显示来自不同用户的项目混合在一起。在您看到这些项目的方式上,它会与Pinterest类似。

现在我按照创建日期显示所有这些项目。但是,由于项目是由用户按批次创建的,因此它们不会随机显示(例如,前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

scroll只是给出一个指向迭代中每个项目的光标。然后我将项目推入Feed中。

对数据库的访问在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)排序。

我想就如何以随机的方式真正展示物品提出建议。有可能吗?

1 个答案:

答案 0 :(得分:0)

基于类似的问题,我得出的结论是,如果集合是动态的,那么随机字段是一个有效的解决方案,这意味着文档经常被插入。集合越动态,您就可以拥有越多的“随机”访问权限。