• pymongo helper


    import pymongo
    import click
    
    # 数据库基本信息
    db_configs = {
        'type': 'mongo',
        'host': '127.0.0.1',
        'port': '27017',
        "user": "",
        "password": "",
        'db_name': 'spider'
    }
    
    
    class Mongo():
        def __init__(self):
            self.db_name = db_configs.get("db_name")
            self.host = db_configs.get("host")
            self.port = db_configs.get("port")
            self.client = pymongo.MongoClient(f'mongodb://{self.host}:{self.port}', connect=False, maxPoolSize=10)
            self.username = db_configs.get("user")
            self.password = db_configs.get("passwd")
            if self.username and self.password:
                self.db = self.client[self.db_name].authenticate(self.username, self.password)
            self.db = self.client[self.db_name]
    
        def reset_status(self, col="dianping_seed_data"):
            self.db[col].update_many({'$or': [{'status': 1}, {'status': 3}]}, {'$set': {"status": 0}})
    
        def reset_all_status(self, col="dianping_seed_data"):
            self.db[col].update_many({}, {'$set': {"status": 0}})
    
        def add_index(self, col="dianping_seed_data"):
            # status_code 0:初始,1:开始下载,2下载完了
            self.db[col].create_index([('status', pymongo.ASCENDING)], unique=True)
    
        def get_index(self, col="dianping_seed_data"):
            index_list = self.db[col].list_indexes()
            for index in index_list:
                print(index)
    
        # 找出重复的放入result表中
        def find_duplicate(self, col="dianping_seed_data"):
            """
             {'$out': 'result'}:聚合之后将结果写到新的集合result表里。
            :param col:
            :return:
            """
            result = self.db[col].aggregate([
                {'$group': {
                    '_id': {'url': "$url"},
                    '_id_list': {'$addToSet': "$_id"},  ##_id字段添加到返回结果里面去
                    'status': {'$addToSet': "$status"},  ##status字段添加到返回结果里面去
                    'count': {'$sum': 1}
                }}, {'$out': 'result'}
            ], allowDiskUse=True)
            for item in result:
                print(item)
            return result
    
        def delete_dup(self, col="dianping_seed_data"):
            delete_data = self.db.result.find()
            try:
                for d in delete_data:
                    # 保留一条
                    unique_id_list = d.get("_id_list")[1:]
                    for did in unique_id_list:
                        self.db[col].delete_one({'_id': did})
                self.db.result.drop()
            except Exception as e:
                print("删除的时候出现问题", e.args)
    
    
    @click.command()
    @click.option('--s', type=str, default="two", help="状态:all表示全部重置为0,two:表示重置状态为1、3的重置为0")
    @click.option('--i', type=str, default="a", help="a:增加索引 g:获取索引")
    @click.option('--d', type=str, default="f", help="d:删除 f:查询并生成聚合之后的结果")
    def run(s, i, d):
        m = Mongo()
        if s:
            print("获取参数为:", s)
            if s == "all":
                print("所有数据状态重置为0:", s)
                m.reset_all_status()
            elif s == "two":
                print("部分数据状态重置为0:", s)
        if i:
            if i == "a":
                m.add_index()
            elif i == "g":
                m.get_index()
        if d:
            if d == "d":
                m.delete_dup()
            elif i == "f":
                m.find_duplicate()
    
    
    if __name__ == '__main__':
        m = Mongo()
        m.delete_dup()
    
    
  • 相关阅读:
    .Net开发中IIS启动后,网站不能访问。0x80004005 无法执行程序。所执行的命令为 .....问题
    .Net开发中项目无法引用/项目引用失败/引用文件出现黄色警告图标,并生成失败的问题
    Mac系统安装Docker
    小程序开发----微信小程序实现下拉刷新功能
    小程序开发----微信小程序navigate跳转没反应
    小程序开发----小程序点击复制文本内容到剪贴板
    小程序开发----微信小程序直接写 设置空格无效
    python字符串的反转
    python2项目迁移到python3
    robotframework废弃的关键词以及替代的关键词(关键词找不到,可能已经过期了)
  • 原文地址:https://www.cnblogs.com/c-x-a/p/11844881.html
Copyright © 2020-2023  润新知