Вернуть вложенные документы в запрос - PullRequest
8 голосов
/ 28 февраля 2010

Можно ли выполнить запрос и вернуть вложенные документы?

В настоящее время у меня есть:

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 не следует встраивать.

1 Ответ

5 голосов
/ 28 февраля 2010

Я полагаю, что вы ищете все комментарии новее, чем три дня назад? Поскольку ваши Комментарии являются просто внедренными документами, они не существуют без объекта Post, поэтому нет возможности «запросить» их отдельно (на самом деле это будущая функция 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

Предостережение: приведенный выше код полностью не проверен и существует только в качестве примера, но теоретически должен возвращать все комментарии за последние три дня, отсортированные в порядке убывания.

...