首页 > 解决方案 > 如何在 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))

标签: pythonmongodbpymongo

解决方案


我不知道您有一种方法可以在一个查询中执行此操作。

你可以做的是首先使用$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 不会对该数组执行任何操作。


推荐阅读