如何更新MongoDB数据库中的嵌套数组

89次阅读
没有评论

问题描述

在使用MongoDB时遇到了一个问题,他需要更新数据库中的嵌套数组。具体地说,他想要更新“categories”数组,以及其中的嵌套数组“donors_info”。他尝试了一些代码,但似乎无法实现更新。他使用了pymongo库来访问MongoDB Atlas实例。

解决方案

以下解决方案中的代码示例使用了pymongo库来进行MongoDB操作。请根据实际情况进行适当的修改。

方案1:正确的update_one命令格式

在更新MongoDB中的嵌套数组时,确保正确使用update_one命令,正确地组织更新操作。以下是正确的update_one命令格式示例:

from pymongo import MongoClient
from bson.objectid import ObjectId

# 连接MongoDB数据库
client = MongoClient("mongodb://<your_connection_string>")
db = client["your_database"]
collection_one = db["your_collection"]

# 要更新的数据和信息
data = {
    "group_wallet_id": "<your_group_wallet_id>",
    "amount": 100
}
user_id = "<user_id>"
category_id = "<category_id>"
now = datetime.datetime.now()

# 更新操作
collection_one.update_one(
    {"group_wallet_id": ObjectId(data["group_wallet_id"])},
    {
        "$set": {"update_at": now},
        "$inc": {"total_donations": data["amount"]},
        "$push": {
            "categories": {
                "category_id": category_id,
                "categories.$.donors_info": {
                    "user_id": ObjectId(user_id),
                    "total_balance": convert_to_decimal128(data["amount"]),
                    "d_created_at": now,
                    "d_updated_at": now
                },
                "c_created_at": now,
                "c_updated_at": now,
                "amount": convert_to_decimal128(data["amount"])
            }
        }
    },
    session=session
)

确保在更新操作中正确使用$set$inc$push等操作符,以及正确的嵌套路径。在本例中,categories.$.donors_info表示要更新categories数组中特定索引位置的donors_info数组。

方案2:操作包装

在使用update_one命令时,确保所有操作都被包装在同一个字典内。以下是示例:

collection_one.update_one(
    {"group_wallet_id": ObjectId(data["group_wallet_id"])},
    {
        "$set": {"update_at": now},
        "$inc": {"total_donations": data["amount"]},
        "$push": {
            "categories": {
                "category_id": category_id,
                "categories.$.donors_info": {
                    "user_id": ObjectId(user_id),
                    "total_balance": convert_to_decimal128(data["amount"]),
                    "d_created_at": now,
                    "d_updated_at": now
                },
                "c_created_at": now,
                "c_updated_at": now,
                "amount": convert_to_decimal128(data["amount"])
            }
        }
    },
    session=session
)

确保所有操作都在同一个字典内,以便一次性进行多个操作。

总结

在更新MongoDB中的嵌套数组时,使用适当的操作符和嵌套路径,确保所有操作都正确包装在一个字典内。这样就可以有效地更新嵌套数组和子文档的数据。

请根据你的实际情况,将代码示例中的数据和信息替换为正确的值,并根据需要进行适当的修改。

正文完