आपको जिस विधि की आवश्यकता है वह है update_one()
upsert=True
. के साथ एक लूप में; आप उपयोग नहीं कर सकते insert_many()
दो कारणों से; सबसे पहले आप हमेशा सम्मिलित नहीं करते हैं; कभी-कभी आप अपडेट कर रहे होते हैं; दूसरा update_many()
(और insert_many()
) केवल एक फिल्टर पर काम करें; आपके मामले में प्रत्येक फ़िल्टर अलग है क्योंकि प्रत्येक अपडेट एक अलग समय से संबंधित है।
यह सामान्य समाधान है जो डेटाफ़्रेम को संयोजित करेगा (df_a
, df_b
इस मामले में - आपके पास जितने चाहें उतने हो सकते हैं) जिस तरह से आपको चाहिए। यह itrows का उपयोग करता है
डेटाफ़्रेम की प्रत्येक पंक्ति प्राप्त करने के लिए, दिनांक पर फ़िल्टर करें, और डेटाफ़्रेम में मानों को सेट करें। $set
ऑपरेटर मानों को ओवरराइड कर देगा यदि वे पहले से मौजूद हैं और सेट नहीं होने पर उन्हें सेट कर देंगे। upsert=True
अगर तारीख पर कोई मेल नहीं है तो एक इंसर्ट करेगा।
for df in [df_a, df_b]:
for _, row in df.iterrows():
db.mycollection.update_one({'date': row.get('date')}, {'$set': row.to_dict()}, upsert=True)
पूर्ण कार्य उदाहरण:
from pymongo import MongoClient
from pprint import pprint
import datetime
import pandas as pd
# Sample data setup
db = MongoClient()['mydatabase']
data_a = [[datetime.datetime(2017, 5, 19, 21, 20), 96, 8, 98],
[datetime.datetime(2017, 5, 19, 21, 21), 95, 8, 97],
[datetime.datetime(2017, 5, 19, 21, 22), 95, 8, 97]]
df_a = pd.DataFrame(data_a, columns=['date', 'std_500_1000window', 'std_50_100window', 'std_50_2000window'])
data_b = [[datetime.datetime(2017, 5, 19, 21, 20), 98, 9, 10],
[datetime.datetime(2017, 5, 19, 21, 21), 98, 9, 10],
[datetime.datetime(2017, 5, 19, 21, 22), 98, 9, 10]]
df_b = pd.DataFrame(data_b, columns=['date', 'std_50_3000window', 'std_50_300window', 'std_50_500window'])
# Perform the upserts
for df in [df_a, df_b]:
for _, row in df.iterrows():
db.mycollection.update_one({'date': row.get('date')}, {'$set': row.to_dict()}, upsert=True)
# Print the results
for record in db.mycollection.find():
pprint(record)
परिणाम:
{'_id': ObjectId('5f0ae909df5531ac655ce528'),
'date': datetime.datetime(2017, 5, 19, 21, 20),
'std_500_1000window': 96,
'std_50_100window': 8,
'std_50_2000window': 98,
'std_50_3000window': 98,
'std_50_300window': 9,
'std_50_500window': 10}
{'_id': ObjectId('5f0ae909df5531ac655ce52a'),
'date': datetime.datetime(2017, 5, 19, 21, 21),
'std_500_1000window': 95,
'std_50_100window': 8,
'std_50_2000window': 97,
'std_50_3000window': 98,
'std_50_300window': 9,
'std_50_500window': 10}
{'_id': ObjectId('5f0ae909df5531ac655ce52c'),
'date': datetime.datetime(2017, 5, 19, 21, 22),
'std_500_1000window': 95,
'std_50_100window': 8,
'std_50_2000window': 97,
'std_50_3000window': 98,
'std_50_300window': 9,
'std_50_500window': 10}