MongoDB中的批量Upsert与$addToSet的高效使用

2024-03-02 10:38:14 浏览数 (2)

引言
在处理数据库操作时,特别是在涉及到MongoDB这类NoSQL数据库时,常常会遇到需要批量更新或插入数据的场景。这种场景下,批量Upsert操作成为了一个非常实用的工具。Upsert操作是一种特殊的数据库操作,它结合了更新(Update)和插入(Insert)的功能。如果指定的数据已存在,则更新该数据;如果不存在,则插入新的数据。此外,MongoDB提供了$addToSet操作符,它用于向数组中添加元素,但仅当该元素尚不存在于数组中时才会添加,从而避免了重复。本文将通过一个具体的示例,展示如何在MongoDB中高效地使用批量Upsert$addToSet来处理数据。

实例

在MongoDB中,批量Upsert操作可以通过使用bulk_write方法配合upsert选项来实现。此外,$addToSet操作符允许我们向文档中的数组添加唯一元素,这在处理例如用户标签、分类等去重数据时非常有用。

下面使用模拟数据并结合具体示例来说明如何使用:

模拟数据
代码语言:javascript复制
[
    {
        "_id": 1,
        "name": "张三",
        "age": 13,
        "tags": ["good"]
    },
    {
        "_id": 2,
        "name": "李四",
        "age": 12
    }
]
代码示例
代码语言:javascript复制
# -*- coding: utf-8 -*-
# @Author: 胖胖很瘦
# @Date: 2024-02-23 16:25:51
# @LastEditors: 胖胖很瘦
# @LastEditTime: 2024-02-23 17:49:30

from pymongo import MongoClient
from pymongo.errors import BulkWriteError
from pymongo import UpdateOne

client = MongoClient()

# 连接数据库
col = client['twoCenter']['1220']


def insertTestData():
    """
    插入模拟数据
    """
    col.insert_many([
        {
            "_id": 1,
            "name": "张三",
            "age": 13,
            "tags": ["good"]
        },
        {
            "_id": 2,
            "name": "李四",
            "age": 12
        }])

def bulkUpsertData():
    """
    执行批量更新操作
    """
    bulk_dos = []
    bulk_dos.append(
        UpdateOne(
            filter={
                "_id": 1
            },
            update={
                '$addToSet': {
                    "tags": { "$each": ["shy", "smile"] }
                },
                '$setOnInsert': {
                    "_id": 1,
                },
            },
            upsert=True
        )
    )
    bulk_dos.append(
        UpdateOne(
            filter={
                "_id": 2
            },
            update={
                '$addToSet': {
                    "tags": "Responsible"
                },
                '$setOnInsert': {
                    "_id": 2,
                },
            },
            upsert=True
        )
    )
    try:
        result = col.bulk_write(bulk_dos, ordered=False)
        print(result.bulk_api_result)
    except BulkWriteError as bwe:
        print(bwe.details)


def find():
    """
    查询数据
    """
    print(list(col.find()))


if __name__ == "__main__":
    # insertTestData()
    bulkUpsertData()
    find()
输出
代码语言:javascript复制
{'writeErrors': [], 'writeConcernErrors': [], 'nInserted': 0, 'nUpserted': 0, 'nMatched': 2, 'nModified': 0, 'nRemoved': 0, 'upserted': []}
[{'_id': 1, 'name': '张三', 'age': 13, 'tags': ['good', 'shy', 'smile']}, {'_id': 2, 'name': '李四', 'age': 12, 'tags': ['Responsible']}]

这样就实现了在使用批量更新操作时, 同时使用addToSet关键字。在使用addToSet时,

完事, 周末快乐~

MongoDB的批量Upsert操作结合$addToSet操作符,为处理批量数据更新提供了一个既强大又灵活的解决方案。这种方法不仅可以有效地更新数据,还可以确保数据的唯一性和一致性,非常适合处理用户兴趣爱好、标签等需要去重的场景。通过上述示例的应用,开发者可以在实际项目中灵活运用这些技术,以提高数据处理的效率和准确性。

0 人点赞