Возвратите встроенные документы в запросе

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

В настоящее время я имею:

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 не должен быть встроен.

8
задан vrish88 28 February 2010 в 20:59
поделиться

1 ответ

Полагаю, вы ищете все комментарии новее, чем три дня назад? Поскольку ваши комментарии - это просто встроенные документы, они не существуют без объекта 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

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

5
ответ дан 5 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: