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: 插入、更新
上面代码查询name为daxia 的记录,根据第一个参数判断,数据库中没有对应数据,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