【问题标题】:MongoDb pymongo how to increment multiple documentsMongoDb pymongo如何增加多个文档
【发布时间】:2014-05-28 02:32:32
【问题描述】:

我在 MongoDb 中有如下文件

{ 
   "_id" : ObjectId("53490030cf3b942d63cfbc7b"),
   "dt" : ISODate("2014-04-12T00:00:00Z"),
   "uId" : "abdc123", "count" : 12 
 }

我有一个 uId 列表为["abdc123","abc","cde","efg"]

我需要为每个匹配今天日期的 uId 增加一个计数。如果任何 uId 在今天的“dt”中没有值,那么更新应该为每个计数为 1 的 UIDS 添加一个新文档

我在 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”不在集合中,则不会创建新文档

【问题讨论】:

  • 如果这实际上是插入一个文档,那么它不匹配任何文档。所以这似乎指向你的datetime() 函数没有产生你想要的结果。

标签: python mongodb


【解决方案1】:

要进行上述记录更新,您需要使用 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()

希望这会有所帮助。

【讨论】:

  • BulkUpsertOperation不使用为什么还要导入?
  • 是的,为什么要导入 BulkUpsertOperation?我们如何将它用于批量对象上的 .upsert()?
【解决方案2】:

我认为您必须执行以下操作才能使其正常工作..

["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
   )
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 2013-11-18
    • 2017-07-08
    • 1970-01-01
    相关资源
    最近更新 更多