How to update nested arrays in mongodb database
-
I have this mongodb schema:
{ "bsonType": "object", "required": [ "group_wallet_id", "categories", "total_donations", "created_at" ], "properties": { "group_wallet_id": { "bsonType": "objectId", "description": "Id of the parent group" }, "total_donations": { "bsonType": "decimal", "description": "Total donations" }, "created_at": { "bsonType": "date", "description": "Wallet creation date" }, "updated_at": { "bsonType": "date", "description": "Wallet update latest date" }, "categories": { "bsonType": "array", "items": { "bsonType": "object", "required": [ "category_id", "donor_info", "c_created_at", "c_updated_at" ], "properties": { "category_id": { "bsonType": "objectId", "description": "Category unique id" }, "donors_info": { "bsonType": "array", "items": { "bsonType": "object", "required": [ "user_id", "total_balance", "d_created_date", "d_updated_date" ], "properties": { "user_id": { "bsonType": "objectId", "description": "User id" }, "total_balance": { "bsonType": "decimal", "description": "Amount donated" }, "d_created_at": { "bsonType": "date", "description": "The date the donation was made" }, "d_updated_at": { "bsonType": "date", "description": "The latest update date" } }
} }, "amount": { "bsonType": "decimal", "description": "The total amount donated for per category" }, "c_created_at": { "bsonType": "date", "description": "The date the donation was made" }, "c_updated_at": { "bsonType": "date", "description": "The latest update date" } } } } }
}
I am trying to update the categories array and after that the donors_info nested array. I have this:
donor_3 = 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)
I have tried this and unfortunately I am unable to do this. I using the pymongo lib in my app to access the monogodb atlas instance.
-
I was able to figure out how to update those records. This how the update_one command should be written:
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)
All the operations should be wrapped in a {} as seen above.