当前位置:  开发笔记 > 编程语言 > 正文

在查询中返回嵌入的文档

如何解决《在查询中返回嵌入的文档》经验,为你挑选了1个好方法。

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

目前,我有:

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对象,但不返回注释.我想我可以这样做:

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

但这将返回帖子中的所有评论.我想得到满足这一条件的所有评论.也许Comment不应该嵌入.



1> Michael Blei..:

我假设您正在寻找比三天前更新的所有评论?由于您的注释只是嵌入式文档,因此没有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

警告:以上是完全未经测试的代码,仅作为示例存在,但理论上应该返回过去三天中按降序排序的所有注释.


老实说,这取决于您的应用程序的重点.如果您的应用主要是评论,也许.但是,还有其他解决方案需要考虑.例如,您可以创建一个称为"注释"的非规范化上限集合,它只是将最新的,大约100个或多个注释存储在单独的集合中.然后,您可以在必要时显示该Feed,但否则显示Post Feed.NoSQL系统鼓励数据设计实验,找到最适合您的方法!
推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有