使用PyMongo更新集合中字典列表中的字典值

时间:2015-03-22 06:51:11

标签: python mongodb mongodb-query pymongo

我的收集结构如下:

defaultdict(
    lambda: {
        '_id' : None,
        'stuff' : [defaultdict(lambda : 0)]
    })

我正在尝试初始化一个字典列表,我会继续更新,如果字典的密钥已经存在,那么我会将其值增加1,否则我会&#39 ; ll用新的key, value对更新字典列表。例如是stuff的值是[],我遇到了值val,那么stuff的值将是[{'val' : 1}],如果我得到一个值{{1然后再val2,如果我得到stuff = [{'val' : 1}, {'val2' : 1}],则val应为stuff

我试过了:

[{'val' : 2}, {'val2' : 1}]

其中,table.update({'_id' : data['_id']}, \ {'$inc' : {"stuff.$."+keyvalue : 1}}) 是具有data的JSON对象和字典_id列表。运行此项我收到了stuff

我无法弄清楚该怎么办?我是一个Mongo新手。

1 个答案:

答案 0 :(得分:2)

引用documentation

  

与更新操作一起使用时,例如db.collection.update()db.collection.findAndModify()

     
      
  • 位置$运算符充当与查询文档匹配的第一个元素的占位符,
  •   
  • 数组字段必须作为查询文档的一部分出现。
  •   

因此stuff数组应出现在您的查询中。现在,由于您正在进行条件更新,因此您需要使用$exists检查您的数组是否已包含keyvalue的任何子文档。

if not table.find_one({ "_id": data['_id'], "stuff": {"$elemMatch": {keyvalue: { "$exists" : True }}}}):
    table.update({ "_id": data['_id'] }, { "$push": { "stuff": { keyvalue: 1 }}})
else:
    table.update({ "_id": data['_id'], "stuff": { "$elemMatch": { keyvalue: { "$exists" : True}}}}, { "$inc": { "stuff.$." + keyvalue: 1}})