ruby-on-rails - 返回查询中的嵌入文档

标签 ruby-on-rails mongodb mongomapper

是否可以执行查询并返回嵌入的文档?

目前,我有:

class Post
  include MongoMapper::Document

  many :comments
end

class Comment
  include MongoMapper::EmbeddedDocument

  belongs_to :post

  key :author
  key :date
  key :body
end

这是一个几乎就在那里的查询:

Post.all("comments.date" => {"$gt" => 3.days.ago})

这将返回所有帖子对象,但不返回评论。我想我可以这样做:

Post.all("comments.date" => {"$gt" => 3.days.ago}).map(&:comments)

但这会返回帖子中的所有评论。我想获得所有符合此条件的评论。或许 Comment 不应该被嵌入。

最佳答案

我假设您正在寻找比三天前更新的所有评论?由于您的 Comments 只是嵌入的文档,因此没有 Post 对象它们就不存在,因此无法单独“查询”它们(这实际上是 future feature of MongoDB )。但是,您可以轻松添加一个方便的方法来帮助您:

class Comment
  include MongoMapper::EmbeddedDocument

  def self.latest
    Post.all(:conditions => {"comments.date" => {"$gt" => 3.days.ago}}).map{|p| p.comments}.flatten
  end
end

此方法会为您提供过去三天内已更新的所有评论,但它们不会完全按顺序排列。更好的解决方案可能是使用 Map/Reduce 来提取最新评论:

class Comment
  include MongoMapper::EmbeddedDocument

  def self.latest
    map = <<-JS
    function(){ 
      this.comments.forEach(function(comment) {
        emit(comment.created_at, comment)
      });
    }
    JS
    r = "function(k,vals){return 1;}" 
    q = {'comments.created_at' => {'$gt' => 3.days.ago}}

    Post.collection.map_reduce(m,r,:query => q).sort([['$natural',-1]])
  end
end

警告:以上是完全未经测试的代码,仅作为示例存在,但理论上应该按降序返回最近三天的所有评论。

关于ruby-on-rails - 返回查询中的嵌入文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2349533/

相关文章:

java - Spring Data MongoDB 始终将对象标识为新对象

ruby-on-rails - Ruby Looking Array of hash 性能

ruby-on-rails - Rails - 对 engine_name 的调用似乎被忽略

java - 在spring中配置mongodb,application.properties还是AbstractMongoConfiguration?

ruby-on-rails - ember-data DS.attr 的动态数量

ruby-on-rails - rails 3 : Call back for when a certain object is pulled from the database (Mongo Mapper)

ruby-on-rails - MongoMapper:维护基于键作为数组的关联的排序顺序

ruby-on-rails - 尝试通过 Rails 4 中的 ActiveAdmin 创建新用户时,密码 "can' t 为空

javascript - 通过 Rails 中的复选框和下拉菜单更新多个记录。

node.js - 从 node.js session 获取信息与从数据库获取信息