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