vri*_*h88 8 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
Run Code Online (Sandbox Code Playgroud)
这是一个几乎存在的查询:
Post.all("comments.date" => {"$gt" => 3.days.ago})
Run Code Online (Sandbox Code Playgroud)
这将返回所有post对象,但不返回注释.我想我可以这样做:
Post.all("comments.date" => {"$gt" => 3.days.ago}).map(&:comments)
Run Code Online (Sandbox Code Playgroud)
但这将返回帖子中的所有评论.我想得到满足这一条件的所有评论.也许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
Run Code Online (Sandbox Code Playgroud)
此方法可以获取过去三天内已更新的所有注释,但它们不会完全按顺序排列.更好的解决方案可能是使用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
Run Code Online (Sandbox Code Playgroud)
警告:以上是完全未经测试的代码,仅作为示例存在,但理论上应该返回过去三天中按降序排序的所有注释.
归档时间: |
|
查看次数: |
1495 次 |
最近记录: |