Вставка / Обновление Коллекции MongoDB в Python - PullRequest
0 голосов
/ 27 марта 2020

Я создал для l oop в python, который просматривает коллекцию прогнозов в MongoDB и проверяет, есть ли строка, содержащая тот же идентификатор студента и текущую дату. Если есть, он должен обновить строку, если нет, должен вставить строку. Ниже мой код:

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

Predictions = getPredictions(school)
Predictions = pd.DataFrame(Predictions)

for i in df.index:
    student = df.loc[i,'students']
    dateToday = date.today()
    probabilityOfLowerThanThreshold = 100       
    dateToday = datetime.datetime.combine(dateToday, datetime.time(0, 0))

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

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

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

Однако, он не работает. Он вообще ничего не производит в базе данных, поэтому коллекция прогнозов пуста. Я хочу вставить строку data_dict, если она не существует. Если он существует, просто обновите его.

Может кто-нибудь помочь, пожалуйста?

1 Ответ

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

Этот автономный пример кода, надеюсь, поможет вам в этом. При первом запуске он создаст запись из кадра данных; во второй раз он обновит его.

from pymongo import MongoClient
import pandas as pd
import datetime

DB = MongoClient()['mydatabase']

# Seed some test data
data = [['5beee5678d62101c9c4e7dbb', '5bf3e06f9a892068705d8420', '2020-03-27', 0.000038],
        ['5beee5678d62101c9c4e7dbc', '5bf3e06f9a892068705d8421', '2020-03-26', 0.000037]]
df = pd.DataFrame(data, columns=['school', 'student', 'date', 'Probability'])

for rowindex, row in df.iterrows():
    record = row.to_dict()
    record['date'] = datetime.datetime.combine(datetime.date.today(), datetime.time(0, 0))
    DB.session_attendance_predicted.replace_one({'student': row.get('student'), 'date': record['date']}, record, upsert=True)
...