обновить значение внутри вложенного документа в MongoDB (pymon go) - PullRequest
1 голос
/ 07 апреля 2020

как обновить значение в базе данных с помощью MongoDB и python

Ниже приведена схема документа, который я хочу обновить:

{'_id': ObjectId('5e8c8f19efd3d269180afdf6'), 
 'student': 2, 
 'sem': 
 [
     {
         'sem_2': {
              'c': 90, 
              'c++': 98, 
              'java': 82, 
              'go': 96, 
              'python': 99
                 }
        }, 

      {
          'sem_1': {
              'daa': 90, 
              'dbms': 70, 
              'es': 79, 
              '.net': 89, 
              'ds': 88
          }
      }
 ]

}

Я хочу обновить " sem_1 "значение в документе.

{

          'sem_1': {
              'daa': 99, 
              'dbms': 99, 
              'es': 99, 
              '.net': 99, 
              'ds': 99
          }

}

Мне нужен вывод наподобие

{'_id': ObjectId('5e8c8f19efd3d269180afdf6'), 
 'student': 2, 
 'sem': 
 [
     {
         'sem_2': {
              'c': 90, 
              'c++': 98, 
              'java': 82, 
              'go': 96, 
              'python': 99
                 }
        }, 

      {
          'sem_1': {
              'daa': 99, 
              'dbms': 99, 
              'es': 99, 
              '.net': 99, 
              'ds': 99
          }
      }
 ]

}

Я использую PyMon go, есть ли способ обновить этот тип документа?

1 Ответ

0 голосов
/ 07 апреля 2020

Вы можете сделать это с помощью позиционного оператора $ в MongoDB:

db.collection.updateOne(
  { student: 2, "sem.sem_1": { $exists: true } }, // You need to have this `sem.sem_1` check in order to make `$` work
  {
    $set: {
      "sem.$": {
        sem_1: {
          daa: 99,
          dbms: 99,
          es: 99,
          ".net": 99,
          ds: 99,
        }
      }
    }
  }
);

В pymon go:

Вы можете сделать то же самое, используя .update_one () :

db.collection.update_one({ student: 2, "sem.sem_1": { $exists: true } }, 
      {
        $set: {
          "sem.$": {
            sem_1: {
              daa: 99,
              dbms: 99,
              es: 99,
              ".net": 99,
              ds: 99,
            }
          }
        }
      })

Примечание: Поскольку update_one вернет WriteResult вместо документа, если вы хотел вернуть фактический документ, затем попробуйте .find_one_and_update ()

...