检查文档是否已更新或插入python中的mongodb

f4t66c6m  于 2022-11-03  发布在  Go
关注(0)|答案(1)|浏览(168)

我在节点js中有以下代码,它检查文档是否已更新/插入。

studentSchool = await this.studentSchoolModel.findOneAndUpdate(
   { student: studentID, phase: "Secondary" },
   { student: studentID, school: schoolID, phase: "Secondary"},
   { new: false, upsert: true, rawResult: true });

我尝试在python中执行相同的操作,但收到以下错误:

studentSchool = studentSchoolModel.find_one_and_update(
    { 'student': studentID, 'phase': 'Secondary' }, 
    { "$set": {'student': studentID, 'school': schoolID, 'phase': 'Secondary',}}, 
    new=True, upsert=True, rawResult=True );

错误:BSON字段“passRawResult”是未知字段
有人知道我做错了什么吗?

8oomwypt

8oomwypt1#

似乎Mongoose添加了rawResult参数,最新的MongoDB(v6.0)和Pymongo本身并不支持该参数。
您可以将ReturnDocument设置为before,如果进行upsert,则结果为None,否则为现有文档的词典。
因此,您的查询变为

from pymongo.collection import ReturnDocument

studentSchool = studentSchoolModel.find_one_and_update(
    { 'student': studentID, 'phase': 'Secondary' }, 
    { "$set": {'school': schoolID}}, 
    upsert=True, 
    return_document=ReturnDocument.BEFORE
)

if isinstance(studentSchool, None):
    print("Upsert was made")
else:
    print("Update was made")

来自MongoDB文档https://www.mongodb.com/docs/manual/reference/method/db.collection.findOneAndUpdate/#update-document-with-upsert:
如果returnNewDocument为false,则该操作将返回null,因为没有要返回的原始文档。
正如您所看到的,我还从$set中删除了“student”和“phase”键,因为它们在本例中似乎没有必要,因为如果使用upsert创建新文档,查询中的部分也将用于它。

相关问题