计算相关集合的计数

时间:2014-03-13 10:02:17

标签: ruby-on-rails mongodb ruby-on-rails-4 mongoid

我有两个专业人士和项目模型

  

专业人士有很多项目

     

项目属于专业人士

在专业人士索引页面中,我需要显示专业人员的项目数量。

现在我正在进行以下查询以获取所有专业人员。 我如何获取每个专业人员的项目计数。

@pros = Professionals.all.asc(:name)

2 个答案:

答案 0 :(得分:2)

我会将projects_count添加到Professional

然后

class Project
  belongs_to :professional, counter_cache: true
end

每次将项目添加到专业人员或从专业人员中删除时,rails都会处理计数。然后你就可以对每个专业人士做.projects_count。

编辑: 如果你真的想要额外的数据

@pros = Professionals.includes(:projects).order(:name)

然后

@pros.each do |pro|
  pro.name
  pro.projects.each do |project|
    project.name
  end
end

答案 1 :(得分:2)

我只是在这里抽象,因为导轨的东西真的不是我的包。但是,让我们谈谈架构和要寻找的事情。因此,代码实际上只是“伪代码”,但应该关闭到想要的东西。

考虑“只是”MongoDB将如何存储数据,并且您可能看起来有多个集合。我并不是说最佳模型是否存在,而只是处理它。

让我们假设我们有“项目”的数据

{
    "_id" : ObjectId("53202e1d78166396592cf805"),
    "name": "Project1,
    "desc": "Building Project"
},
{
    "_id" : ObjectId("532197fb423c37c0edbd4a52")
    "name": "Project2",
    "desc": "Renovation Project"
}

对于“专业人士”,我们可能会有这样的事情:

{
    "_id" : ObjectId("531e22b7ba53b9dd07756bc8"),
    "name": "Steve",
    "projects": [
        ObjectId("53202e1d78166396592cf805"),
        ObjectId("532197fb423c37c0edbd4a52")
    ]
}

右。所以现在我们看到“专业”必须有某种概念,即在另一个集合中有相关项目以及相关项目是什么。

现在我认为,(并且不是我的包)有一种方法可以降低Mongoid中驱动程序实现的较低级别(我相信是轻便摩托车的顶部)并且它很可能(以类似的方式调用(来自内存)(将“Professionals”作为类模型名称):

Professionals.collection.aggregate([
    { "$unwind": "$projects" },
    { "$group": {
        "_id": "$_id",
        "count": { "$sum": 1 }
    }
])

或者以某种类似的形式,或多或少类似于你在本机mongodb shell中所做的那样。关键是,通过这样的方式,您只需要服务器完成工作,而不是将所有结果都拉到客户端并循环遍历它们。

建议您使用本机代码来迭代数据存储中的结果会产生反效果,并且使用任何类型的后端数据库存储都可以直观地反对。无论是SQL数据库还是NoSQL数据库,只要数据库具有进行聚合工作的方法,然后使用它们,一般的首选项就是。

如果您编写的代码基本上从您的商店中提取每条记录,然后循环以获得结果,那么您做错了。

使用数据库方法。否则你也可以只使用一个文本文件并完成它。