python - 如何在 mongodb 中更新 json 数组中的特定 json 对象
问题描述
{
"userId" : "111",
"userName":"abc",
"skills":[
{
"DomainName" : "Application",
"skillName" : "Python",
"months" : "2",
"level" : "8",
"CertificationStatus" : "Yes"
},
{
"DomainName" : "Application",
"skillName" : "Angular",
"months" : "0",
"level" : "9",
"CertificationStatus" : "Yes"
},{
"DomainName" : "Application",
"skillName" : "Nodejs",
"months" : "5",
"level" : "6",
"CertificationStatus" : "Yes"
}
]
}
我想更新月份:3,nodejs的级别为2 ..如果已经存在它应该更新,否则它应该在数组中添加那个特定的json
我使用 mongodb 在烧瓶中使用的命令是:
skill ={
"DomainName" : "Application",
"skillName" : "Nodejs",
"months" : "3",
"level" : "2",
"CertificationStatus" : "Yes"
}
skills_dummy_collection =
mongo.db.skills_master.find({'userId':'111'},{skills:{"$elematch":
{'skills.skillName':'Nodejs'}}})
if skills_dummy_collection:
mongo.db.skills_master.update({"skills.skillName"
:'Nodejs','userId':'111'}, {"$set": {
"skills":skill
} })
else:
mongo.db.skills_master.insert(json_util._json_convert(skill))
解决方案
我不知道您有一种方法可以在一个查询中执行此操作。
你可以做的是首先使用$elemMatch来 $ addToSet,它会处理记录中不存在的情况skills
,然后执行 a$set
来处理它存在的情况:
.update({
userId: '111',
'skills.skillName': { $not: { '$elemMatch' : { 'skillName' : 'Nodejs'}}}
}, {
$addToSet: {
"skills": {
"DomainName": "Application",
"skillName": "Nodejs",
"months": "3",
"level": "2",
"CertificationStatus": "Yes"
}
}
})
使用 的第二个操作$set
将更新所有skills.months
不等于"3"
和在哪里skillName
的 Nodejs
记录:
.update({
userId: '111',
'skills.skillName': 'Nodejs',
'skills.months': { $ne: "3" }
}, {
$set: {
"skills.$": {
"DomainName": "Application",
"skillName": "Nodejs",
"months": "3",
"level": "2",
"CertificationStatus": "Yes"
}
}
})
注意事项$addToSet
:
$addToSet 运算符将一个值添加到数组中,除非该值已经存在,在这种情况下,$addToSet 不会对该数组执行任何操作。
推荐阅读
- python - LinkedList 删除功能正在删除 2 个节点
- c# - 在Unity / c#中向firebase发出请求后返回字符串
- c - C 中的 Windows DLL 注入器不注入 DLL
- pandas - 如何使用 pandas 操作数组中的数据
- arrays - 从字符串的开头查找单词的特定数量
- javascript - 如何找到特定数字的所有可能排列?
- javascript - 在 Javascript 中替换/附加 HREF 文件类型扩展名
- holoviews - 如何在 holoviews 布局中对齐网格空间图?
- typescript - Typescript如何处理本机接口
- java - 如何使用流获取数组列表的特定值