MongoDb pymongo 如何增量更新多个文档

3 投票
2 回答
2044 浏览
提问于 2025-04-18 02:39

我在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()

希望这能帮到你。

撰写回答