Phương thức bạn cần là update_one()
với upsert=True
trong một vòng lặp; bạn không thể sử dụng insert_many()
Vì hai lý do; trước hết bạn không phải lúc nào cũng chèn; đôi khi bạn đang cập nhật; thứ hai là update_many()
(và insert_many()
) chỉ hoạt động trên một bộ lọc duy nhất; trong trường hợp của bạn, mỗi bộ lọc khác nhau vì mỗi bản cập nhật liên quan đến một thời điểm khác nhau.
Đây là giải pháp chung sẽ kết hợp các khung dữ liệu (df_a
, df_b
trong trường hợp này - bạn có thể có bao nhiêu tùy thích) theo cách bạn cần. Nó sử dụng iterrows
để lấy từng hàng của khung dữ liệu, lọc ngày và đặt các giá trị cho các hàng trong khung dữ liệu. $set
toán tử sẽ ghi đè các giá trị nếu chúng đã ở đó và đặt chúng nếu chưa được đặt. upsert=True
sẽ thực hiện chèn nếu không có ngày trùng khớp.
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)
Ví dụ hoạt động đầy đủ:
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)
Kết quả:
{'_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}