python mongo存在插入不存在更新,同时指定如果不存在才插入的字段

import asyncio
import datetime
from loguru import logger
from motor.motor_asyncio import AsyncIOMotorClient
from collections import Iterable

try:
    import uvloop

    asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
except ImportError:
    pass

db_configs = {
    'host': '127.0.0.1',
    'port': '27017',
    'db_name': 'mafengwo',
    'user': ''
}

class MotorOperation:
    def __init__(self):
        self.__dict__.update(**db_configs)
        if self.user:
            self.motor_uri = f"mongodb://{self.user}:{self.passwd}@{self.host}:{self.port}/{self.db_name}?authSource={self.db_name}"
        else:
            self.motor_uri = f"mongodb://{self.host}:{self.port}/{self.db_name}"
        self.client = AsyncIOMotorClient(self.motor_uri)
        self.mb = self.client[self.db_name]
    async def save_data_with_status(self, items, col="seed_data"):
        for item in items:
            data = dict()
            data["update_time"] = datetime.datetime.now()
            data["status"] = 0  # 0初始
            data.update(item)
            print("data", data)
            await self.mb[col].update_one({
                "url": item.get("url")},
                {'$set': data, '$setOnInsert': {'create_time': datetime.datetime.now()}},
                upsert=True)

需要注意的是

{'$set': data, '$setOnInsert': {'create_time': datetime.datetime.now()}},

$setOnInsert里面使用的字段是数据不存在的时候才插入的,存在就不动了,只插入set里面指定的。
另外$setOnInsert里面使用的字段不能在$set里面再次出现

猜你喜欢

转载自www.cnblogs.com/c-x-a/p/11895685.html