更新MongoDB(pymongo)中的嵌套文档中的值

时间:2020-04-07 15:00:35

标签: python mongodb pymongo

如何使用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
          }
      }
 ]

}

我正在使用PyMongo,有没有办法更新此类文档?

1 个答案:

答案 0 :(得分:0)

您可以在MongoDB中使用位置$运算符来做到这一点:

this.M.AutoInit()

pymongo 中:

您可以使用.update_one()进行同样的操作:

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,
        }
      }
    }
  }
);

注意::由于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, } } } }) 将返回WriteResult而不是文档,如果您想返回实际文档,请尝试.find_one_and_update()