1

在此处输入代码我目前正在开发一个通过 mongoid 运行 mongodb 的 Rails 应用程序。假设我有两个集合、帖子和评论,它们通过 HABTM 关系链接,我想选择评论最多的帖子,我认为这样做的方法是计算每个帖子的评论并按comments.count DESC排序。我不知道如何计算每个帖子的评论数,在帖子结果count(comments) AS comments_count中添加一列,如SQL,并按此“伪字段”排序。

对此有什么想法吗?

谢谢

编辑,查看与此相关的其他答案,我尝试过:

db.posts.aggregate([  
  { $group: {  
    _id: { post_id: '$post_id', comment_id: '$comment_id' }  
  }},  
  { $group: {  
    _id: '$_id.post_id',  
    comments_count: { $sum: 1 }  
  }}]  
  , function(err, result){  
     console.log(result);  
  }  
);

我越来越

{
"result" : [{
        "_id" : null,
        "datasets_count" : 1
    }],
"ok" : 1
}
4

1 回答 1

3

MongoDB 中的聚合框架具有用于分组、求和和排序的运算符。以下是如何按评论数量对帖子进行分组、计数和排序的工作示例。希望这是您想要的并且对您有所帮助。

模型/post.rb

class Post
  include Mongoid::Document
  has_many :comments
  field :text, type: String
end

模型/comment.rb

class Comment
  include Mongoid::Document
  belongs_to :post
  field :text, type: String
end

测试/单元/post_test.rb

require 'test_helper'
require 'pp'
class PostTest < ActiveSupport::TestCase
  def setup
    Post.delete_all
    Comment.delete_all
  end
  test "posts ordered by comment count" do
    [ [ "Now is the time for all good men to come to the aid of their country.",
        [ "Tally ho!" ] ],
      [ "Twas brillig, and the slithy toves did gyre and gimble in the wabe.",
        [ "Off with their heads!",
          "The time has come, the walrus said.",
          "Curiouser and curiouser." ] ],
      [ "The quick brown fox jumped over the lazy dog.",
        [ "The typewriter is mightier than the sword.",
          "Dachshund is a badger dog." ] ]
    ].each do |post, comments|
      post = Post.create(text: post)
      comments.each{|comment| post.comments << Comment.create(text: comment)}
    end
    pipeline = [
        { '$group' => {
            '_id' => '$post_id',
            'count' => { '$sum' => 1 }
          }
        },
        { '$sort' => { 'count' => -1}
        }
    ]
    result = Comment.collection.aggregate(pipeline).to_a.collect do |post_id_count|
      Post.find(post_id_count['_id'])
    end
    puts
    pp result
  end
end

耙式试验

运行测试:

[1/1] PostTest#test_posts_ordered_by_comment_count
[#<Post _id: 52717e7f7f11ba52d8000003, text: "Twas brillig, and the slithy toves did gyre and gimble in the wabe.">,
 #<Post _id: 52717e7f7f11ba52d8000007, text: "The quick brown fox jumped over the lazy dog.">,
 #<Post _id: 52717e7f7f11ba52d8000001, text: "Now is the time for all good men to come to the aid of their country.">]
Finished tests in 0.050494s, 19.8043 tests/s, 0.0000 assertions/s.
1 tests, 0 assertions, 0 failures, 0 errors, 0 skips
于 2013-10-30T21:55:31.213 回答