【问题标题】:Using Pymongo Upsert to Update or Create a Document in MongoDB using Python使用 Pymongo Upsert 在 MongoDB 中使用 Python 更新或创建文档
【发布时间】:2020-03-27 19:57:05
【问题描述】:

我有一个数据框,其中包含我要上传到 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

我有以下代码检查 mongo 中的一行是否包含相同的学生 ID 和日期,如果没有,则添加该行:

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)

但是,如果它确实存在,我希望它使用新值更新该行。有谁知道如何做到这一点?我看过 pymongo 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

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

    要更新插入,您不能使用 insert()(已弃用)insert_one()insert_many()。您必须使用支持更新插入的collection level operators 之一。

    首先,我会指导您逐行阅读数据帧并在每一行上使用replace_one()。有更高级的方法可以做到这一点,但这是最简单的。

    你的代码看起来有点像:

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

    【讨论】:

    • 谢谢@BellyBuster。那么这行代码是否会检查学生和日期是否在 mongo 集合中连续存在?如果它确实颠倒了它?这会取代我的 if 语句吗?
    • 好的,如果它不存在,它会插入行,还是我需要为此添加更多代码?
    • 如果根据过滤条件(例如{'Student': student, 'Date': date})找不到匹配项,它将插入一条记录,如果找到匹配项,它将用新记录覆盖现有记录.
    • 我收到此错误:TypeError: replacement must be an instance of dict, bson.son.SON, or any other type that inherits from collections.Mapping
    • 您要更新插入的record 必须是字典。
    猜你喜欢
    • 2016-11-11
    • 2021-11-30
    • 2015-08-27
    • 2021-06-22
    • 2013-06-05
    • 1970-01-01
    • 2015-11-18
    • 2016-05-31
    • 2020-05-16
    相关资源
    最近更新 更多