我的收集结构如下:
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新手。
答案 0 :(得分:2)
与更新操作一起使用时,例如
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}})