mongodb aggregate 求 distinct, count的功能

本贴最后更新于 3288 天前,其中的信息可能已经时移世易

需求,实现查询,各手游的各渠道的充值人数,充值次数,以及充值总额
select app_id, count(1), count(distinct account_id), sum(recharge_sum) from table group app_id

mongo数据行如下: <!--more-->
&gt; db.t_recharge_history.find({},{"_id":0,"d":0,"s":0});
{ "a" : "121200", "p" : "100037", "c" : "PE", "r" : "12", "rd" : ISODate("2014-08-20T00:00:00Z"), "m" : 1 }
{ "a" : "121200", "p" : "100037", "c" : "PE", "r" : "1", "rd" : ISODate("2014-08-20T00:00:00Z"), "m" : 2 }
{ "a" : "332222", "p" : "100037", "c" : "PE", "r" : "3", "rd" : ISODate("2014-08-20T00:00:00Z"), "m" : 3 }
{ "a" : "333333", "p" : "100062", "c" : "PE", "r" : "123", "rd" : ISODate("2014-08-20T00:00:00Z"), "m" : 33 }
{ "a" : "333334", "p" : "100062", "c" : "PE", "r" : "44", "rd" : ISODate("2014-08-20T00:00:00Z"), "m" : 12 }
{ "a" : "333334", "p" : "100062", "c" : "PE", "r" : "44", "rd" : ISODate("2014-08-20T00:00:00Z"), "m" : 1 }
a: 账户
p: 应用id
c: 渠道
r: 角色ID
rd: 充值日期。

查询方法如下:
1. 先作 应用id, 渠道,玩家 的group , 算出每玩家的充值总额,充值次数
db.t_recharge_history.aggregate(
                                                [
                                                  {
                                                    "$match":{
                                                               "rd" : ISODate("2014-08-20T00:00:00Z")
                                                             }
                                                  },
                                                  { "$project": { "p": 1,  "m":1, "a":1, "c":1,"_id":0 }},
                                                  {
                                                      "$group": {
                                                                  "_id": { "app_id" :"$p", "channel_id" : "$c","account_id":"$a" } ,
                                   "cnt": { "$sum": 1},
                                                                  "rmb_sum": { "$sum": "$m"}
                                                                }  
                                                  },
                                                ]
                                            )

的出下面结果。
{
"result" : [
{
"_id" : {
"app_id" : "100037",
"channel_id" : "PE",
"account_id" : "121200"
},
"cnt" : 2,
"rmb_sum" : 3
},

。。。
2. 将1 的结果再次group,按照应用,渠道 作 group
db.t_recharge_history.aggregate(
[
{
"$match":{
"rd" : ISODate("2014-08-20T00:00:00Z")
}
},
{ "$project": { "p": 1, "m":1, "a":1, "c":1,"_id":0 }},
{
"$group": {
"_id": { "app_id" :"$p", "channel_id" : "$c","account_id":"$a" } ,
"cnt": { "$sum": 1},
"rmb_sum": { "$sum": "$m"}
}
},
{
"$group": {
"_id": { "app_id" :"$_id.app_id", "channel_id" : "$_id.app_id" } ,
"player_cnt": { "$sum": 1},
"recharge_items_cnt": { "$sum": "$cnt" },
"rmb_sum": { "$sum": "$rmb_sum"}
}
},
]
)

最终得出结果:
{
"result" : [
{
"_id" : {
"app_id" : "100062"
},
"player_cnt" : 2,
"recharge_items_cnt" : 3,
"rmb_sum" : 46
},
{
"_id" : {
"app_id" : "100037"
},
"player_cnt" : 2,
"recharge_items_cnt" : 3,
"rmb_sum" : 6
}
],
"ok" : 1
}

  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    91 引用 • 59 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 678 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 182 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖 • 1 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    947 引用 • 1460 回帖 • 2 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 229 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 93 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 381 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 644 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖 • 1 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 828 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 241 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 505 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 105 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 148 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    211 引用 • 358 回帖 • 1 关注
  • 自由行
    4 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 180 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 696 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    209 引用 • 2040 回帖
  • Excel
    31 引用 • 28 回帖
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 537 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8216 回帖 • 4 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    76 引用 • 258 回帖 • 627 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 2 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖