MongoDB-查找表里面重复的记录

一、背景

项目中使用的是mongodb数据库,在测试数据入库的时候,会根据源数据,然后生成一个自增的id到数据库里面,然后线上和测试环境针对同一条数据的id是不一致的。某些数据又只有id与线上匹配上的时候,才能关联上更多的数据,因此,我会去写一个脚本将同一条数据,将测试环境的id改成和线上的一致。但可能由于脚本写的还不够完善,导致数据库里面可能会写入一些重复id的记录进去,然后id又没有加唯一索引。有重复的数据又会导致正常执行etl任务会报错,因此,需要查询出在mongodb里面某个字段重复的记录。

二、先来回顾一下mysql中的用法

先来看一下如果是使用mysql的话,大家会怎么样去查询重复的记录呢?

比如,以metersphere平台的数据库为例,想查找出某个接口下写了超过2个有效用例的case,应该怎么查找呢:

SELECT  api_definition_id,  COUNT(*) FROM  api_test_case WHERE  `status` <> "Trash" GROUP BY  api_definition_id HAVING  COUNT(*) > 1 ORDER BY  COUNT(*) DESC

查出来的结果如下:

 

三、mongo中的用法

接下来看一下在mongo中,分组统计与筛选的用法。这里不介绍具体的用法,直接展示查询语句:

比如查询user表中满足age大于15数据中,并且name重复的记录:

db.user.aggregate(
   [
      { $match: { age:{$gt:15}} },
      { $group: { _id: "$name", count: { $sum: 1 } } },
       { $match: { count: { $gt: 1 } } },
      { $sort: { count: -1 } },
      { $limit: 5000 }
   ],
   { allowDiskUse: true }
)

 运行结果如下:

 注意:

默认情况下,MongoDB 会尝试在内存中完成聚合操作,但是如果数据量很大,内存可能会不足,从而导致聚合操作失败。allowDiskUse选项允许 MongoDB 将中间结果写入磁盘而不是内存,这有助于解决内存不足的问题,并且可以支持处理更大的数据集。需要注意的是,使用磁盘可能会导致聚合操作的速度变慢,因为磁盘通常比内存慢得多。因此,您应该在需要时才使用allowDiskUse选项,以避免不必要的磁盘访问。

四、chatgpt能帮我们写出来这个语句吗?

在chatpgt还没有出现之前,针对这种复杂的语句,自己要去百度学习他的用法,会稍微有点复杂,也可以使用studio3t的付费版,上面支持直接写mysql语法格式的sql进行查询,也可以帮你转换为mongo的js查询语法的语句。

在chatgp出现之后,现在这些都不是难事了:

 

 

B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值