使用Python在Mongodb中的单个文档中更新具有不同值的多个不同子文档的方法

时间:2016-10-03 08:17:08

标签: python mongodb pandas dataframe

我在Python中使用pandas数据帧,目前我的数据框是:

product_id  mock_test_id  q_id  q_correct_option  language_id   is_corr  is_p    is_m
    2790          2999     1                 1            1      1        1       1
    2790          2999     2                 1            1      1        1       1 
    2790          2999     3                 2            1      0        1       1
    2790          2999     4                 3            1      2        1       1
    2790          2999     5                 3            1      3        1       1

,收集文件如下:

{ "_id" : ObjectId("57eea81cd65b43a872024522"), 
  "langid" : 1, 
  "mocktest_id" : 2999, 
  "pid" : 2970, 
  "userid" : 1223, 
  "attempt" : { 
         "1" : { "seqid" : 1, 
                  "o" : NumberLong(1), 
                  "t" : NumberLong(749825), 
                  "is_m" : 1, 
                  "is_p" : 1, 
                  "is_corr" : 0 }, 
         "2" : { "seqid" : 2, 
                 "o" : NumberLong(2), 
                 "t" : NumberLong(749825), 
                 "is_m" : 1, 
                 "is_p" : 1, 
                 "is_corr" : 1 }
  }


}

现在我想一次更新这个文档,其中,在尝试之内'对象我们有q_id作为其中的键。从上面可以看出,q_id也存在于数据帧中。现在,对应于每个mock_test_id,product_id,q_id我想一次更新is_p,is_m,is_corr字段,其中is_p或is_corr字段可能存在也可能不存在。

现在,我正在迭代数据帧并逐行更新:

for index,row in stud_mock_result_df:
         db.UserAttemptData.update({'userid':user_id,'mocktest_id':mock_test_id,'pid':pid},{'$set':{'attempt.'+str(row['q_id'])+'.is_m':0,'attempt.'+str(row['q_id'])+'.is_p':1,'attempt.'+str(row['q_id'])+'.is_corr':row['is_corr']}})

如何一次更新?

1 个答案:

答案 0 :(得分:1)

使用一个查询,您可以为数组的多个对象设置相同的值,但要为不同的对象设置不同的值,您必须点击多个查询。

如果您想更新具有相同值的多个对象,则在这种情况下使用 {multi:true} 选项。

     db.UserAttemptData.update(condition, update, {multi: true}).