【pymongodb】去除重复记录

every blog every motto: You can do more than you think.

0. 前言

duang duang duang

1. 正文

1.1 插入数据

import pymongo

client = pymongo.MongoClient()
db = client['test']
collection = db['gb']

collection.insert_one({
    
    'name': 'xiaoming', 'age': 19})
collection.insert_one({
    
    'name': 'xiaoming', 'age': 19})
collection.insert_one({
    
    'name': 'xiaomei', 'age': 12})

结果
在这里插入图片描述

1.2 方法一 distinct

1.2.1 基本原理

distinct原本只可以查询某条字段的唯一值,和numpy中unique方法类似。演示如下:

name = collection.distinct('name')
print(name)

在这里插入图片描述

1.2.2 实例展示

根据某几个字段判断记录是否重复,进而删除重复字段。

name = collection.distinct('name')
age = collection.distinct('age')
name_age = zip(name, age)

for name, age in name_age:
    data = collection.find_one({
    
    'name': name, 'age': age})  # 根据字段查询记录
    collection.delete_many({
    
    'name': name, 'age': age})  # 删除所有记录
    collection.insert_one(data)  # 重新插入记录

1.2.3 结果

在这里插入图片描述

1.3 方法二:插入时检查是否重复update

说明:利用update方法,对插入的数据进行判断是否存在,如果存在则不“插入(更新)”,不存在,则插入。具体见1.3.2

1.3.1 普通插入

data = [{
    
    'name': 'xiaoming', 'age': 19}, {
    
    'name': 'xiaoming', 'age': 19}, {
    
    'name': 'xiaomei', 'age': 12}]

for ele in data:
    collection.insert_one(ele)

在这里插入图片描述

1.3.2 更新,过滤相同的值(插入前去重)

1. upsert:False

已有数据
在这里插入图片描述

1.1 数据库中没有指定的name
up_a = {
    
    'name': 'daxia', 'age': 100}

up_data = [up_a]
for ele in up_data:
    temp = collection.update_one({
    
    'name': ele['name']}, {
    
    '$set': ele}, False)
    print(temp)

说明:

  • update的第一个参数是查询条件,即根据这个条件查询已存在(集合collection)中的数据
  • update的第二个参数是将要插入的值
  • update的第三个参数upsert,默认为False
    • False:只更新不插入
    • True: 插入、更新

上面代码查询namedaxia 的记录,根据第一个参数判断,数据库中没有对应数据,upsert为False,则,不更新,结果无变换。

1.2 数据库中有指定的name
up_a = {
    
    'name': 'xiaomei', 'age': 100}

up_data = [up_a]
for ele in up_data:
    temp = collection.update({
    
    'name': ele['name']}, {
    
    '$set': ele}, False)
    print(temp)

如下图,对应数据,进行了更新
在这里插入图片描述

2. upsert:True

已有数据
在这里插入图片描述

2.1 数据库中没有指定的name
up_a = {
    
    'name': 'daxia', 'age': 100}

up_data = [up_a]
for ele in up_data:
    temp = collection.update_one({
    
    'name': ele['name']}, {
    
    '$set': ele}, True)

如下图所示,插入成功
在这里插入图片描述

2.2 数据库中有指定的name
up_a = {
    
    'name': 'xiaomei', 'age': 100}

up_data = [up_a]
for ele in up_data:
    temp = collection.update_one({
    
    'name': ele['name']}, {
    
    '$set': ele}, True)
    # print(temp)

在这里插入图片描述

小结:

  • update的第三个参数upsert
    • 默认False,只更新,不插入
    • True, 即更新,也插入
  • 可以通过设置第三个参数为True,再设置第一个参数为(每条记录的)唯一值对每条记录进行过滤,匹配到相同的唯一值,进行更新,没有匹配到,则插入达到插入前进行去重的效果。

参考文献

[1] https://www.jianshu.com/p/c9cdf6c8b379
[2] https://www.cnblogs.com/lkd8477604/p/9848958.html
[3] https://blog.csdn.net/Homewm/article/details/89312555
[4] https://www.jianshu.com/p/95db57fd93b3

猜你喜欢

转载自blog.csdn.net/weixin_39190382/article/details/119710495