Использование Pymon go Upsert для обновления или создания документа в MongoDB с использованием Python - PullRequest
0 голосов
/ 27 марта 2020

У меня есть фрейм данных, который содержит данные, которые я хочу загрузить в MongoDB. Ниже приведены данные:

    MongoRow = pd.DataFrame.from_dict({'school': {1: schoolID}, 'student': {1: student}, 'date': {1: dateToday}, 'Probability': {1: probabilityOfLowerThanThreshold}})

                     school                   student        date  Probability
1  5beee5678d62101c9c4e7dbb  5bf3e06f9a892068705d8420  2020-03-27     0.000038

У меня есть следующий код, который проверяет, содержит ли строка в mon go тот же идентификатор студента и дату, если нет, то добавляет строку:

def getPredictions(school):
    schoolDB = DB[school['database']['name']]
    schoolPredictions = schoolDB['session_attendance_predicted']
    Predictions = schoolPredictions.aggregate([{
        '$project': {
            'school': '$school',
            'student':'$student',
            'date':'$date'
        }        
    }])
    return list(Predictions)
Predictions = getPredictions(school)
Predictions = pd.DataFrame(Predictions)

schoolDB = DB[school['database']['name']]
collection = schoolDB['session_attendance_predicted']
import json

for i in Predictions.index:
    schoolOld = Predictions.loc[i,'school']
    studentOld = Predictions.loc[i,'student']
    dateOld = Predictions.loc[i,'date']
    if(studentOld == student and date == dateOld):
        print("Student Exists")
        #UPDATE THE ROW WITH NEW VALUES
    else:
        print("Student Doesn't Exist")
        records = json.loads(df.T.to_json()).values()
        collection.insert(records)

Однако, если он существует, я хочу обновить строку новыми значениями. Кто-нибудь знает как это сделать? Я смотрел на pymon go upsert, но я не уверен, как его использовать. Кто-нибудь может помочь?

'' '' '' 'ОБНОВЛЕНИЕ' '' '' ''

Выше частично работает сейчас, однако, я теперь получаю сообщение об ошибке со следующим кодом :

dateToday = datetime.datetime.combine(dateToday, datetime.time(0, 0))

MongoRow = pd.DataFrame.from_dict({'school': {1: schoolID}, 'student': {1: student}, 'date': {1: dateToday}, 'Probability': {1: probabilityOfLowerThanThreshold}})
data_dict = MongoRow.to_dict()

for i in Predictions.index:
    print(Predictions)
    collection.replace_one({'student': student, 'date': dateToday}, data_dict, upsert=True)

Ошибка:

InvalidDocument: documents must have only string keys, key was 1

1 Ответ

1 голос
/ 27 марта 2020

Для защиты нельзя использовать insert() (устарело) insert_one() или insert_many(). Вы должны использовать один из операторов уровня сбора , который поддерживает upserting.

Чтобы начать, я бы указал вам на то, чтобы читать строку данных построчно и использовать replace_one() на каждой строке. Есть более продвинутые способы сделать это, но это самый простой.

Ваш код будет выглядеть примерно так:

collection.replace_one({'Student': student, 'Date': date}, record, upsert=True)
...