草庐IT

mongodb - Mongo 按条件分组和计数

coder 2023-11-02 原文

我有这样的数据,我想做的是通过按性别对员工进行分组来统计员工。

{
   _id: ObjectId("57fd6b064a8d7733079d1bb9"),
   name: "Alex",
   age: 23,
   position: "Manager",
   employees: [{
       _id: ObjectId("58056e62281b7a73dfdb6887"),
       employee_id: ObjectId("57df832364efef57c3540610"),
       name: "Bob",
       age: 20,
       gender: "Male",
       position: "Distributor"
   }, {
       _id: ObjectId("58049fe7bc82e44583c52a64"),
       employee_id: ObjectId("57df830264efef57c354060d"),
       name: "Cindy",
       age: 19,
       gender: "Female",
       position: "Administrator"
   }, {
       _id: ObjectId("58049fe7bc82e44583c52a64"), 
       employee_id: ObjectId("57df830264efef57c354060d"), 
       name: "Dylan",
       age: 21,
       gender: "Male",
       position: "Engineer"
  }]
}

所以,我想要的数据是这样的

{
   _id: ObjectId("57fd6b064a8d7733079d1bb9"),
   name: "Alex",
   age: 23,
   position: "Manager",
   male_employees: 2,
   female_employees: 1,
}

我已经尝试过聚合,但仍然与我想要的相去甚远。 我不知道如何将它们分组并同时使用大小

最佳答案

在您的聚合管道中,您不需要对文档进行分组,只需使用单个 $project 投影您想要的字段即可 管道,你需要使用 $size $filter 组合根据性别获取员工数量,无需使用 $unwind

$filter 部分等式将根据给定条件过滤掉数组元素,在本例中为二元性别值。 <强> $size 运算符随后将返回过滤后的数组的长度,从而为您提供员 worker 数。

让我们看一个例子:

var count = function(gender){
    return {
        "$size": {
            "$filter": {
                "input": "$employees",
                "as": "emp",
                "cond": { "$eq": [ "$$emp.gender", gender ] }
            }
        }
    }
};
db.collection.aggregate([
    {
        "$project": {
            "name": 1,
            "age": 1,
            "position": 1,
            "male_employees": count("Male"),
            "female_employees": count("Female")
        }
    }
]);

示例输出

{
    "_id" : ObjectId("57fd6b064a8d7733079d1bb9"),
    "name" : "Alex",
    "age" : 23,
    "position" : "Manager",
    "male_employees" : 2,
    "female_employees" : 1
}

关于mongodb - Mongo 按条件分组和计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40215129/

有关mongodb - Mongo 按条件分组和计数的更多相关文章

  1. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  2. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  3. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  4. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  5. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

  6. ruby - 使用多个数组创建计数 - 2

    我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']

  7. ruby - 在 Ruby 中创建按公共(public)键值分组的新哈希 - 2

    假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解

  8. ruby-on-rails - 使用包含多个关联和单独的条件 - 2

    我的Gallery模型中有以下查询:media_items.includes(:photo,:video).rank(:position_in_gallery)我的图库模型有_许多媒体项,每个都有一个照片或视频关联。到目前为止,一切正常。它返回所有media_items包括它们的photo或video关联,由media_item的position_in_gallery属性排序。但是我现在需要将此查询返回的照片限制为仅具有is_processing属性的照片,即nil。是否可以进行相同的查询,但条件是返回的照片等同于:.where(photo:'photo.is_processingIS

  9. ruby-on-rails - 在 haml View 中重构条件 - 2

    除了可访问性标准不鼓励使用这一事实指向当前页面的链接,我应该怎么做重构以下View代码?#navigation%ul.tabbed-ifcurrent_page?(new_profile_path)%li{:class=>"current_page_item"}=link_tot("new_profile"),new_profile_path-else%li=link_tot("new_profile"),new_profile_path-ifcurrent_page?(profiles_path)%li{:class=>"current_page_item"}=link_tot("p

  10. ruby-on-rails - 在具有 ActiveRecord 条件的相关模型中按字段排序 - 2

    我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我

随机推荐