Как обновить конкретный объект JSON внутри JSON Arry в Mongodb - PullRequest
0 голосов
/ 08 октября 2018
{   
"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, уровень до 2 для nodejs .. если он уже существует, он должен обновиться, в противном случае он должен добавить этот конкретный 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))

1 Ответ

0 голосов
/ 08 октября 2018

Я не знаю, как вы можете сделать это в одном запросе.

Сначала вы можете $ addToSet с $ elemMatch , который позаботится о случаях, когда запись не существует в skills, а затем выполнит $set, чтобы позаботиться о случаях, когда он существует:

.update({
  userId: '111',
  'skills.skillName': { $not: { '$elemMatch' : { 'skillName' : 'Nodejs'}}}
}, {
  $addToSet: {
    "skills": {
      "DomainName": "Application",
      "skillName": "Nodejs",
      "months": "3",
      "level": "2",
      "CertificationStatus": "Yes"
    }
  }
})

2-ая операция с $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 ничего не делает с этим массивом.

...