python-3.x - 向 MongoDB pymongo 中的特定集合元素添加新字段
问题描述
我正在尝试通过向其中添加新字段来更新现有数组元素。
...
{
"_id": "f08b466a-163b-4d9e-98f5-d900ef0f1a26",
"firstName": "foo",
"result": [
{
"_id":"957ee97d-d461-4d6c-8a80-57351bdc29f7",
"subjectName":"Mathematics",
"marks": 60
},
{
"_id":"0591d9a0-fd0f-4876-9bd3-dec4d5ab452e",
"subjectName":"Science",
"marks": 70
},
{
"_id":"21f42104-791b-4522-81ce-f7ae1b30d075",
"subjectName":"Social science",
"marks": 50
}
]
},
...
现在我想在名为“isFavorite: true”的科学科目中添加新领域
喜欢,
{
"_id": "f08b466a-163b-4d9e-98f5-d900ef0f1a26",
"firstName": "foo",
"result": [
{
"_id":"957ee97d-d461-4d6c-8a80-57351bdc29f7",
"subjectName":"Mathematics",
"marks": 60
},
{
"_id":"0591d9a0-fd0f-4876-9bd3-dec4d5ab452e",
"subjectName":"Science",
"marks": 70
"isFavorite": true #-----------------New field----------
},
{
"_id":"21f42104-791b-4522-81ce-f7ae1b30d075",
"subjectName":"Social science",
"marks": 50
}
]
},
...
到目前为止我尝试了什么?
from pymongo import MongoClient
...
collection = mongoInstance["student"]
student = collection.find_one({"_id": "f08b466a-163b-4d9e-98f5-d900ef0f1a26"})
for result in student["result"]:
if result["_id"] == "0591d9a0-fd0f-4876-9bd3-dec4d5ab452e":
result["isFavorite"] = True
break
collection.update_one({"_id": "f08b466a-163b-4d9e-98f5-d900ef0f1a26"}, {"$set": student })
这是可行的,但我相信可能有一种简单的方法可以通过它的 id 查找学生文档,并按 item._id 将新字段添加到数组中。
寻找一些优雅的 Mongodb 查询来查找和更新特定的数组元素。
解决方案
@Alex Blex 在位置运算符方面是正确的;pymongo 语法非常相似:
db.mycollection.update_one({'_id': 'f08b466a-163b-4d9e-98f5-d900ef0f1a26',
'result._id': '0591d9a0-fd0f-4876-9bd3-dec4d5ab452e'},
{'$set': {'result.$.isFavorite': True}})
使用提供的示例数据的完整示例:
from pymongo import MongoClient
import pprint
db = MongoClient()['mydatabase']
db.mycollection.insert_one({
'_id': 'f08b466a-163b-4d9e-98f5-d900ef0f1a26',
'firstName': 'foo',
'result': [
{
'_id': '957ee97d-d461-4d6c-8a80-57351bdc29f7',
'subjectName': 'Mathematics',
'marks': 60
},
{
'_id': '0591d9a0-fd0f-4876-9bd3-dec4d5ab452e',
'subjectName': 'Science',
'marks': 70
},
{
'_id': '21f42104-791b-4522-81ce-f7ae1b30d075',
'subjectName': 'Social science',
'marks': 50
}
]
})
db.mycollection.update_one({'_id': 'f08b466a-163b-4d9e-98f5-d900ef0f1a26',
'result._id': '0591d9a0-fd0f-4876-9bd3-dec4d5ab452e'},
{'$set': {'result.$.isFavorite': True}})
pprint.pprint(list(db.mycollection.find())[0])
结果:
{'_id': 'f08b466a-163b-4d9e-98f5-d900ef0f1a26',
'firstName': 'foo',
'result': [{'_id': '957ee97d-d461-4d6c-8a80-57351bdc29f7',
'marks': 60,
'subjectName': 'Mathematics'},
{'_id': '0591d9a0-fd0f-4876-9bd3-dec4d5ab452e',
'isFavorite': True,
'marks': 70,
'subjectName': 'Science'},
{'_id': '21f42104-791b-4522-81ce-f7ae1b30d075',
'marks': 50,
'subjectName': 'Social science'}]}
推荐阅读
- android - React Native - Google Fit API 无法获取步骤
- git - 如何仅签出特定提交的内容?
- python - 如何在推送到容器的注册表之前对构建的映像运行测试?
- c# - 如何解决电报中设置webhook的错误
- android-studio - 如何在android中向上设置微调器的位置?
- ios - Swift-以相同的顺序解码字典
- python - Pandas 将值分配给过滤后的数据帧/系列。为什么不一致?
- javascript - TypeError:无法读取 DirectionPage.CalculateDistanceWithGoogleApi 处未定义的属性“地图”
- javascript - 在javascript上将字数计入多维数组
- python - 发布时 Wagtail ValidationError(页面修订实例不存在)