MongoDb pymongo 如何增量更新多个文档
我在MongoDb中有一个这样的文档:
{
"_id" : ObjectId("53490030cf3b942d63cfbc7b"),
"dt" : ISODate("2014-04-12T00:00:00Z"),
"uId" : "abdc123", "count" : 12
}
我有一个uId的列表,内容是 ["abdc123","abc","cde","efg"]
我需要把每个今天日期匹配的uId的计数加一。如果某个uId在今天的“dt”中没有值,那么更新操作应该为每个uId添加一个新文档,计数为1。
我在Python中的查询代码如下:
client.Mydb.mycoll.update(
{
"uId":{"$in":["abdc123","abc","cde","efg"]},
"dt":datetime(y,m,d)
},
{"$inc":{"count":1}},
upsert=True,
multi=True
)
但是输出结果并不是我预期的,它只创建了一个计数为1的文档。
请给我建议一个正确的pymongo查询。
更新:对于增加已经存在的值,上面的代码是有效的,但如果“uId”和“dt”不在集合中,就不会创建新文档。
2 个回答
0
我觉得你需要做一些下面的事情才能让它正常工作..
["abdc123","abc","cde","efg"] { ///lopp all of them
client.Mydb.mycoll.update({
"uId": <loop-variable>, // for each value .. eg. "abc123" ...
"dt":datetime(y,m,d)},{"$inc":{"count":1}
},
upsert=True,
multi=True
)
}
6
要进行你提到的记录更新,你需要使用 pymongo.bulk.BulkUpsertOperation,具体操作如下:
from pymongo.bulk import BulkUpsertOperation
bulk=clientConn.db.table.initialize_ordered_bulk_op()
for i in someList:
bulk.find({'uid':i,"dt":datetime(y,m,d)}).upsert().update({'$inc': {'count': 1}})
res=bulk.execute()
希望这能帮到你。