代码
from loguru import logger
from pymongo import MongoClient
class MongoHelper:
def __init__(self, url=None, db=None, coll=None):
self.client = MongoClient(url) if url else MongoClient()
self.coll = self.client.get_database(db).get_collection(coll)
def find(self, query: dict = None, only_show: list = None, dont_show: list = None, limit: int = None):
query = query or {}
only_show = only_show or []
dont_show = dont_show or []
show = {}
show.update({v: 1 for v in only_show})
show.update({v: 0 for v in dont_show})
res = self.coll.find(query, show)
return list(res) if limit is None else list(res.limit(limit))
def insert_one(self, item: dict, unique: str = None):
filed = unique or '_id'
res = self.coll.update_one({filed: item[filed]}, {'$setOnInsert': item}, upsert=True)
return True if res.raw_result.get('upserted') else False
def insert_many(self, items: list, unique: str = None):
filed = unique or '_id'
items1 = []
temp = []
for v in items:
key = v[filed]
if key not in temp:
temp.append(key)
items1.append(v)
exists = [v[filed] for v in self.coll.find({filed: {'$in': temp}})]
items2 = [v for v in items1 if v[filed] in set(temp) - set(exists)]
if items2:
res = self.coll.insert_many(items2)
return len(res.inserted_ids)
else:
return 0
def update_one(self, query: dict, new: dict):
res = self.coll.update_one(query, {'$set': new})
return True if res.raw_result.get('nModified') else False