我的数据看起来像这样:

{

"_id" : "9aa072e4-b706-47e6-9607-1a39e904a05a",

"customerId" : "2164289-4",

"channelStatuses" : {

"FOO" : {

"status" : "done"

},

"BAR" : {

"status" : "error"

}

},

"channel" : "BAR",

}

我的聚合/组看起来像这样:

{

"_id" : {

"customerId" : "$customerId",

"channel" : "$channel",

"status" : "$channelStatuses[$channel].status"

},

"count" : {

"$sum" : 1

}

}

所以基本上通过示例数据,该组应该给我一个分组的组:

{"customerId": "2164289-4", "channel": "BAR", "status": "error"}

但是我不能在聚合/组中使用[] -indexing.我该怎么做呢?

最佳答案 使用.aggregate()无法获得当前结构所需的结果.您“可以”更改结构以使用数组而不是命名键,操作实际上非常简单.

所以有一个文件,如:

{

"_id" : "9aa072e4-b706-47e6-9607-1a39e904a05a",

"customerId" : "2164289-4",

"channelStatuses" : [

{

"channel": "FOO",

"status" : "done"

},

{

"channel": "BAR",

"status" : "error"

}

],

"channel" : "BAR",

}

{ "$group": {

"_id": {

"customerId" : "$customerId",

"channel" : "$channel",

"status": {

"$arrayElemAt": [

{ "$map": {

"input": { "$filter": {

"input": "$chanelStatuses",

"as": "el",

"cond": { "$eq": [ "$$el.channel", "$channel" ] }

}},

"as": "el",

"in": "$$el.status"

}},

0

]

}

},

"count": { "$sum": 1 }

}}

较早版本的MongoDB将需要$unwind来访问匹配的数组元素.

在MongoDB 2.6中,您仍然可以在展开之前“预过滤”数组:

[

{ "$project": {

"customerId": 1,

"channel": 1,

"status": {

"$setDifference": [

{ "$map": {

"input": "$channelStatuses",

"as": "el",

"in": {

"$cond": [

{ "$eq": [ "$$el.channel", "$channel" ] },

"$$el.status",

false

]

}

}},

[false]

]

}

}},

{ "$unwind": "$status" },

{ "$group": {

"_id": {

"customerId": "$customerId",

"channel": "$channel",

"status": "$status"

},

"count": { "$sum": 1 }

}}

]

之前的任何事情你都会在$unwind之后“过滤”:

[

{ "$unwind": "$channelStatuses" },

{ "$project": {

"customerId": 1,

"channel": 1,

"status": "$channelStatuses.status",

"same": { "$eq": [ "$channelStatuses.status", "$channel" ] }

}},

{ "$match": { "same": true } },

{ "$group": {

"_id": "$_id",

"customerId": { "$first": "$customerId" },

"channel": { "$first": "$channel" },

"status": { "$first": "$status" }

}},

{ "$group": {

"_id": {

"customerId": "$customerId",

"channel": "$channel",

"status": "$status"

},

"count": { "$sum": 1 }

}}

]

在比MongoDB 2.6更小的版本中,您还需要$project两个字段之间的相等性测试结果,然后在单独的阶段中对结果进行$匹配.您可能还会注意到“两个”$group阶段,因为第一个阶段会在过滤器之后通过$first累加器删除任何可能的“通道”值的重复项.以下$group与上一个列表中的完全相同.

但是如果你不能改变结构并且需要“灵活”匹配你不能提供每个名字的键,那么你必须使用mapReduce:

db.collection.mapReduce(

function() {

emit({

"customerId": this.customerId,

"channel": this.channel,

"status": this.channelStatuses[this.channel].status

},1);

},

function(key,values) {

return Array.sum(values);

},

{ "out": { "inline": 1 } }

)

你当然可以使用那种表示法

mongodb 分组聚合_MongoDB按键值对进行聚合/分组相关推荐

  1. limit mongodb 聚合_MongoDB 聚合操作(转)

    在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多台Server上并行执行复 ...

  2. mysql group by 聚合_浅析MySQL使用 GROUP BY 分组聚合与细分聚合

    1. 聚合函数(Aggregate Function) MySQL(5.7 ) 官方文档中给出的聚合函数列表(图片)如下: 除非另有说明,否则聚合函数都会忽略空值(NULL values). 2. 聚 ...

  3. R语言缺失值替换:缺失的值(NA)替换每个分组最近的非缺失值

    R语言缺失值替换:缺失的值(NA)替换每个分组最近的非缺失值 目录 R语言缺失值替换:缺失的值(NA)替换每个分组最近的非缺失值

  4. pandas使用groupby函数和agg函数获取每个分组特定变量独特值的个数(number of distinct values in each group in dataframe)

    pandas使用groupby函数和agg函数获取每个分组特定变量独特值的个数(number of distinct values in each group in dataframe) 目录

  5. pandas使用groupby函数进行分组聚合、使用agg函数指定聚合统计计算的数值变量、并自定义统计计算结果的名称(naming columns after aggregation)

    pandas使用groupby函数进行分组聚合.使用agg函数指定聚合统计计算的数值变量.并自定义统计计算结果的名称(naming columns after aggregation in dataf ...

  6. pandas使用groupby函数进行分组聚合并使用agg函数将每个分组特定变量对应的多个内容组合到一起输出(merging content within a specific column of g

    pandas使用groupby函数进行分组聚合并使用agg函数将每个分组特定变量对应的多个内容组合到一起输出(merging content within a specific column of g ...

  7. pandas使用groupby函数按照多个分组变量进行分组聚合统计、使用agg函数计算分组的多个统计指标(grouping by multiple columns in dataframe)

    pandas使用groupby函数按照多个分组变量进行分组聚合统计.使用agg函数计算分组的多个统计指标(grouping by multiple columns in dataframe) 目录

  8. R语言ggpubr包ggsummarystats函数可视化分组条形图(自定义分组颜色、添加抖动数据点jitter、误差条)并在X轴标签下方添加分组对应的统计值(样本数N、中位数、四分位数的间距iqr)

    R语言ggpubr包ggsummarystats函数可视化分组条形图(自定义分组颜色.添加抖动数据点jitter.误差条error bar)并在X轴标签下方添加分组对应的统计值(样本数N.中位数med ...

  9. R语言编写自定义函数基于ggsumarystats函数计算每个分组的统计值、自定义可视化分组分面条形图,并在X轴标签下方添加分组对应的统计值(样本数N、中位数median、四分位数的间距iqr)

    R语言编写自定义函数基于ggsumarystats函数计算每个分组的统计值.自定义可视化分组分面条形图,并在X轴标签下方添加分组对应的统计值(样本数N.中位数median.四分位数的间距iqr) 目录

最新文章

  1. [原创]微软网络协议数据分析工具 Microsoft Network Monitor 介绍
  2. asp.net 动态创建TextBox控件 如何加载状态信息
  3. Entity Framework Logging and Intercepting Database Operations (EF6 Onwards)
  4. 【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate
  5. 力扣1281.整数的各位积和之差
  6. mysql on 子句_ON子句中的MySQL未知列
  7. PHP留言板html代码,html怎么操作来实现留言板样式?(代码示例)
  8. jenkins打包后文件通过ssh上传linux服务器配置
  9. could not resolve xxx.jar
  10. 使用plugman开发cordova 高德地图定位插件
  11. Android如何判断系统是否已经被Root
  12. C# 经常忘 该记记
  13. 【算力网络】算力网络的技术创新——算力基础设施关键技术
  14. 企业信息化自主建设的三重保障
  15. 设置键盘一键打开网易云音乐
  16. 心率变异性和身心健康
  17. 基于SSM的物料管理系统(源码+文档+数据库)
  18. FL Studio21中文版编曲音乐宿主软件
  19. 局域网无法访问部分网站
  20. 适合制作U盘启动的WinPE系统大搜集

热门文章

  1. 删除-Trustzone-TEE-ATF
  2. win32 实现死锁的小例子
  3. notsequence 寒假逆向生涯(9/100)
  4. Windows消息机制学习笔记(二)—— 窗口与线程
  5. 5.SEH(结构化异常处理)
  6. 【Pushgateway】正则匹配,分隔逗号成数组
  7. 8、MySQL注释:单行注释和多行注释
  8. 1.17 选择排序法
  9. Servlet程序入门
  10. cmd命令快速启动、暂停和关闭sql server服务