我目前在 Rails 应用程序中有以下控制器方法:
def index
@entries = []
@entries << QuickPost.where(:user_id.in => current_user.followees.map(&:ff_id) << current_user.id)
@entries << Infographic.where(:user_id.in => current_user.followees.map(&:ff_id) << current_user.id)
@entries.flatten!.sort!{ |a,b| b.created_at <=> a.created_at }
@entries = Kaminari.paginate_array(@entries).page(params[:page]).per(10)
end
我意识到这非常低效,所以我正在寻找一种更好的方法来实现相同的目标,但我是 MongoDB 的新手,想知道最好的解决方案是什么。
有没有办法在 MongoDB 中跨两个集合进行排序的 limit() 查询或 MapReduce 函数?我猜没有,但在这种情况下肯定会节省很多精力!
我目前在想我有两个选择:
- 创建一个主 'StreamEntry' 类型模型,并让 Infographic 和 QuickPost 都继承自该模型,以便将两种数据类型存储在同一个集合中。这个问题是我有现有数据,我不知道如何将它从旧集合移动到新集合。
- 使用 Streama (https://github.com/christospappas/streama) 之类的东西创建一个单独的 Stream/ActivityStream 模型。我在这里看到的问题是,它需要大量的前期工作,并且由于隐私设置和项目的编辑/删除,流需要经常重建。
有没有我忽略的选项?我是否过度设计了上述选项?对于这种情况,有哪些最佳实践?
任何信息将不胜感激,到目前为止我真的很喜欢 MongoDB,并希望避免在未来陷入这样的陷阱。谢谢。