• 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()
    
    
  • 相关阅读:
    TApplication元件的OnIdle事件
    Query1AfterScroll 与 DataSource1DataChange 区别
    禁用表外键
    oracle al32utf8 字符长度
    Oracle表空间等操作
    delphi组件说明
    delhpi控件替换
    程序提示Google Internet Authority G2 证书不可用
    PostMessage用法
    OnKeyPress OnKeyDown区别
  • 原文地址:https://www.cnblogs.com/c-x-a/p/11844881.html
Copyright © 2020-2023  润新知