我有这样的数据,我想做的是通过按性别对员工进行分组来统计员工。
{
_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 。
让我们看一个例子:
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/
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano
尝试在我的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
我正在尝试按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']
假设我有一个在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"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解
我的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
除了可访问性标准不鼓励使用这一事实指向当前页面的链接,我应该怎么做重构以下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
我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我