MongoDB - 对pymongo的简单套娃

代码

# -*- coding: utf-8 -*-

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))

    # unique存在  则不操作  反之则新增
    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

    # unique为  _id字段  或者唯一索引字段
    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)]
        # args = len(items), len(items1), len(exists), len(items2)
        # print('准备新增{},去重后得{},库中已有{},最后新增{}'.format(*args))
        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
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值