обновить множественную запись из фрейма данных в mongoDB с помощью upsert = True - PullRequest
0 голосов
/ 08 января 2020

У меня есть датафрейм почти 120000 записей следующим образом. Также у меня есть коллекция mongoDB, которая выглядит точно так же, как показано ниже: датафрейм

ItemID ParentID ItemRating ItemPrice Qty
A1     ItemA1   0          12        100
A2     ItemA2   0          15        200
B1     ItemB1   0          20        300
B2     ItemB2   0          25        400
B3     ItemB3   0          30        150  

Теперь я хочу обновить и вставить запись из моего фрейма данных в коллекцию mon go со следующим условием

  1. Если комбинация ItemID и ParentID присутствует в коллекции, обновите оставшиеся столбцы в коллекцию mon go из фрейма данных
  2. , если комбинация ItemID и ParentID отсутствует, затем вставьте новую запись. Здесь ItemID и ParentID больше похожи на уникальный ключ для проверки условия обновления.

Я знаю, что это можно сделать с помощью метода PyMon go update_many, установив upsert = true. но я не уверен, как я могу это сделать? как мне написать условие моего фильтра?

С уважением, Vipul

1 Ответ

0 голосов
/ 08 января 2020

Вы не сможете использовать update_many(), поскольку для этого требуется один критерий фильтра, который в вашем случае не будет работать. Что вам нужно, это replace_one() в al oop с upsert = true. Что-то вроде:

from pymongo import MongoClient
import pandas as pd
db = MongoClient('localhost', 27019)['testdatabase1']
df = pd.DataFrame({'ItemID':['A1','A2','B1','B2','B3'],
                   'ParentID':['ItemA1','ItemA2','ItemB1','ItemB2','ItemB3'],
                   'ItemRating ': [0,0,0,0,0],
                   'ItemPrice ': [12,15,20,25,30],
                   'Qty': [100,200,300,400,150]
                   })

for row in df.iterrows():
    record = row[1].to_dict()
    result = db.testcollection.replace_one({'ItemId': record.get('ItemId'), 'ParentID': record.get('ParentID')}, record, upsert=True)
    print(f'{"Replaced: " if result.modified_count == 1 else ""}{"Inserted: " if result.upserted_id is not None  else ""} {record}')
...