1. Старт
mongo
Особенно подходит дляхранилище Различные вложения и форматы, которые невозможно определитьданные,иmongo
Встроенная функция дедупликации.(использовать _id
Уникальная поддержка ключей)又Особенно подходит для小爬虫хранилищеданные。Большую часть времени это произойдетданные Операция обновления, Но я не знаю, существует ли оно, 是использоватьinsert
все ещеupdate
。Ты узнаешь, когда увидишь это в конце, Вы также можете обновить некоторые поля, если они существуют. Вставьте, если нет. Не так уж много глупостей, Приступайте к сушке.
datas = [
{
"_id": 1,
"insert_time": time.time(),
"update_time": time.time(),
"name": "zs"
},
{
"_id": 2,
"insert_time": time.time(),
"update_time": time.time(),
"name": "ls"
},
{
"_id": 3,
"insert_time": time.time(),
"update_time": time.time(),
"name": "ww"
},
]
Следующий код реализует:
1. Реализуйте существующее обновление и вставьте, если оно не существует.
2. Реализовать существующее, пропустить и вставить, если оно не существует.
3. Реализуйте существующее обновление и вставьте, если некоторые поля не существуют.
Вместо того, чтобы писать их отдельно, я помещаю их прямо в исходный файл. Наконец, есть тестовые примеры.
# -*- coding: utf-8 -*-
# @Author: Толстый, очень тонкий
# @Date: 2024-03-03 12:58:42
# @LastEditors: Толстый, очень тонкий
# @LastEditTime: 2024-03-03 13:57:49
# Импортировать пакет
import time
from pymongo import MongoClient as MC
from pymongo import UpdateOne
client = MC()["test"]
def exists_update_and_insert(data, bulk=False):
"""
Обновить, если оно существует
Вставьте, если нет
:param data: данные
:param bulk: Использовать ли пакетную вставку
# ordered
# упорядоченное исполнение, Сообщение об ошибке, Не будет выполнено позже
# внеочередное исполнение, Сообщение об ошибке, Остальные не затронуты
"""
if bulk:
bulk_docs = []
for rd in data:
bulk_docs.append(
UpdateOne(
{"_id": rd["_id"]},
{"$set": rd},
upsert=True
))
result = client['goods'].bulk_write(bulk_docs, ordered=False).bulk_api_result
print(result)
else:
for rd in data:
client['goods'].update_one(
{'_id': rd['_id']},
{'$set': rd},
upsert=True
)
def exists_do_noting_and_insert(data, bulk=False):
"""
Если он существует, ничего не делайте.
Вставьте, если нет
:param data: данные
:param bulk: Использовать ли пакетную вставку
"""
if bulk:
bulk_docs = []
for rd in data:
bulk_docs.append(
UpdateOne(
{"_id": rd["_id"]},
{"$setOnInsert": rd},
upsert=True
))
result = client['goods'].bulk_write(bulk_docs, ordered=False).bulk_api_result
print(result)
else:
for rd in data:
client['goods'].update_one(
{'_id': rd['_id']},
{'$setOnInsert': rd},
upsert=True
)
def exists_update_any_field_and_insert(data, bulk=False):
"""
Обновить, если оно существует部分字段
Вставьте, если нет
:param data: данные
:param bulk: Использовать ли пакетную вставку
"""
if bulk:
bulk_docs = []
for rd in data:
update_time = rd.pop("update_time", time.time())
bulk_docs.append(
UpdateOne(
{"_id": rd["_id"]},
{
"$setOnInsert": rd,
"$set": {"update_time": update_time}
},
upsert=True
))
result = client['goods'].bulk_write(bulk_docs, ordered=False).bulk_api_result
print(result)
else:
for rd in data:
update_time = rd.pop("update_time", time.time())
client['goods'].update_one(
{'_id': rd['_id']},
{
'$setOnInsert': rd,
"$set": {"update_time": update_time}
},
upsert=True
)
def find(query=None):
"""
查询данные :query: Условия запроса
"""
return list(client['goods'].find(query))
def remove(query=None):
"""
удалитьданные :query: удалить условие
"""
return client["goods"].remove(query)
if __name__ == '__main__':
# тестданные datas = [
{
"_id": 1,
"insert_time": time.time(),
"update_time": time.time(),
"name": "zs"
},
{
"_id": 2,
"insert_time": time.time(),
"update_time": time.time(),
"name": "ls"
},
{
"_id": 3,
"insert_time": time.time(),
"update_time": time.time(),
"name": "ww"
},
]
"""
тестовый пример
"""
# exists_update_and_insert(datas)
# exists_update_and_insert(datas, True)
# print(find())
# remove()
# exists_do_noting_and_insert(datas)
# exists_do_noting_and_insert(datas, True)
# print(find())
# remove()
# exists_update_any_field_and_insert(datas)
# exists_update_any_field_and_insert(datas, True)
# print(find())
# remove()
Хоть и мало слов, но полно полезной информации. Хороших выходных, пожалуйста, оставьте лайк~