I have a mongo database having data record like below
[
{"name" : "a", "email" : "[email protected]","ml_pred":"valid","hum_pred":"null", "score":0.92},
{"name" : "b","email" : "[email protected]","ml_pred":"invalid","hum_pred":"null", "score":0.2},
{"name" : "c","email" : "[email protected]","ml_pred":"null","hum_pred":"null"},
{"name" : "d","email" : "[email protected]","ml_pred":"null","hum_pred":"null"},
{"name" : "e","email" : "[email protected]","ml_pred":"null","hum_pred":"null"}
]
This data is inserted using insert_many in pymongo like
from pymongo import MongoClient
client = MongoClient('mongodb://testuser:testuser@mongo:27017/testdb?authSource=admin')
mydb = client["testdb"] #Mongo database
mycol = mydb["todos"] #Mongo Collection Name
mycol.insert_many(record)
How is it possible to do bulk update and add new fields in a single step
to the 3rd and 4th document with the following data
[
{"name" : "c","email" : "[email protected]","ml_pred":"valid","hum_pred":"null","score":0.83},
{"name" : "d","email" : "[email protected]","ml_pred":"invalid","hum_pred":"null","score":0.12}
]
CodePudding user response:
You can send 2 updates.You could also make them a bulk update, or you could also write a pipeline update to do both with 1 update, but i think you dont need more complicated things here.
Both match the email, and then update the 2 fields.Using the update $set
operator.
Query1
update(
{"email": {"$eq": "[email protected]"}},
{"$set": {"ml_pred": "valid", "score": 0.83}})
Query2
update(
{"email": {"$eq": "[email protected]"}},
{"$set": {"ml_pred": "invalid", "score": 0.12}})
Edit
I don't use pymongo i guess you need something like this but this depends on the python driver you use also, but it will be simple in all cases
requests = [
UpdateOne(...query1...),
UpdateOne(...query2...)]
try:
db.test.bulk_write(requests, ordered=False)
except BulkWriteError as bwe:
pprint(bwe.details)
CodePudding user response:
I added multiple update and adding of fields by (based on the field email
)
email_id=[data.pop("email") for data in datas]
operations=[UpdateOne({"email":email},{'$set':data}) for email ,data in zip(email_id,datas)]
mycol.bulk_write(operations)