mongo去重统计

简介: 表名:parkUserCostid:patkId:userId:phone:costVal:适合特定条件下,对某些字段进行去重筛选。(比如限定抢购)第一种,使用\(first操作符。

表名:parkUserCost
id:
patkId:
userId:
phone:
costVal:

适合特定条件下,对某些字段进行去重筛选。(比如限定抢购)

第一种,使用\(first操作符。\)first 会把数组的第一个元素取出,作为一个对象。

// 第一种(可转java版本)
db.getCollection('parkUserCost').aggregate([
   {"$match" : {
      "$and" : [
          // {"name" : "1640"} // 筛选条件
           ]
           }
        },
    {"$group" : {
        "_id" : "$phone",
        "val" : {"$first" :  "$costVal" },
        }},
    {"$group" : {
         "_id" : {},
        "totalVal" :{"$sum" : "$val"}
         }}
])

第二种,使用$slice操作符。从数组的第几个开始,截取几个,保存到数组

// 第二种
db.getCollection('parkUserCost').aggregate([
   {"$match" : {
      "$and" : [
          // {"name" : "1640"} // 筛选条件
           ]
           }
        },
    {"$group" : {
        "_id" : "$phone",
        "val" : {"$push" :  "$costVal" },
        }},
    {"$project" : {
         "val" :{"$sum" :{"$slice" : ["$val", 0, 1 ] }}
        }},
    {"$group" : {
         "_id" : {},
        "totalVal" :{"$sum" : "$val"}
         }}
])

第三种,使用$arrayElemAt,返回数组的第几个元素。序号的循环的,最后一个使用-1

// 第三种
db.getCollection('parkUserCost').aggregate([
   {"$match" : {
      "$and" : [
          // {"name" : "1640"} // 筛选条件
           ]
           }
        },
    {"$group" : {
        "_id" : "$phone",
        "val" : {"$push" :  "$costVal" },
        }},
    {"$project" : {
        "val" :  { "$arrayElemAt" :[ "$val" , 0] }
        }},
    {"$group" : {
         "_id" : {},
        "totalVal" :{"$sum" : "$val"}
         }}
])

若要表中的全部字段,可使用$$ROOT获取

db.getCollection('parkUserCost').aggregate([
   {"$match" : {
      "$and" : [
          // {"name" : "1640"} // 筛选条件
           ]
           }
        },
    {"$group" : {
        "_id" : "$phone",
        "item": {"$first": "$$ROOT"},
        "val" : {"$first" :  "$costVal" },
        }},
])

http://www.runoob.com/mongodb/mongodb-tutorial.html

遗失的拂晓
目录
相关文章
|
虚拟化
vmware克隆虚拟机后没有ip地址的问题
解决vmware克隆虚拟机后没有内网ip的问题
|
网络安全
如何在 Debian 系统上配置 NTP,来确保计算机时间的准确同步
如何在 Debian 系统上配置 NTP,来确保计算机时间的准确同步
4258 0
如何在 Debian 系统上配置 NTP,来确保计算机时间的准确同步
|
NoSQL 索引
MongoDB查询优化:从 10s 到 10ms
本文是我前同事付秋雷最近遇到到一个关于MongoDB执行计划选择的问题,非常有意思,在探索源码之后,他将整个问题搞明白并整理分享出来。付秋雷(他的博客)曾是Tair(阿里内部用得非常官方的KV存储系统)的核心开发,目前就职于蘑菇街。
|
2月前
|
人工智能 运维 Java
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
本文基于Apache Flink PMC成员宋辛童在Community Over Code Asia 2025的演讲,深入解析Flink Agents项目的技术背景、架构设计与应用场景。该项目聚焦事件驱动型AI智能体,结合Flink的实时处理能力,推动AI在工业场景中的工程化落地,涵盖智能运维、直播分析等典型应用,展现其在AI发展第四层次——智能体AI中的重要意义。
908 27
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
|
12月前
|
存储 SQL 监控
【Clickhouse 探秘】你真正知道 Clickhouse 吗?
ClickHouse 是一个开源的列式数据库管理系统,专为在线分析处理(OLAP)设计。它由 Yandex 开发并于 2016 年开源。ClickHouse 以其高性能、实时数据处理能力和易用性著称,广泛应用于大数据分析、日志处理和用户行为分析等领域。其主要特点包括列式存储、向量化执行、分布式架构、丰富的数据类型和 SQL 支持。
1247 4
|
人工智能 IDE 测试技术
人工智能 | 结对编程助手GithubCopilot
GitHub Copilot 是一款人工智能编码助手,能够加速您的编程流程。它根据上下文即时提供建议,无论是单行代码还是完整函数。Copilot 由 GitHub、OpenAI 和 Microsoft 联合开发,可在多种 IDE(如 Visual Studio Code、JetBrains IDEs)中使用。只需在 IDE 中安装扩展并激活服务,即可享受智能代码补全功能。虽然 Copilot 有助于提升开发效率,但也需用户审慎检查其提供的建议以确保准确性。试用结束后,记得管理订阅以免产生不必要的费用。
人工智能 | 结对编程助手GithubCopilot
|
Linux Go 网络安全
goland 远程调试 remote debug
goland 远程调试 remote debug
524 0
|
存储 分布式计算 前端开发
jvm性能调优实战 - 26一个每秒10万并发的系统如何频繁发生Young GC的
jvm性能调优实战 - 26一个每秒10万并发的系统如何频繁发生Young GC的
403 0
|
监控 Linux Shell
Linux命令setsid深度解析
`setsid`是Linux命令,用于创建新会话并运行命令,使其独立于终端,不受用户注销影响。它创建新会话和进程组,进程成为领头进程。常用在后台任务,如数据处理和守护进程。示例:`setsid ping baidu.com`。注意需手动重定向I/O,结合`nohup`使用更佳。适用于长时间运行的服务和脚本管理。
|
缓存 NoSQL 关系型数据库