【问题标题】:pymongo UpdateOne does not update a field but do anotherpymongo UpdateOne 不更新一个字段,而是做另一个
【发布时间】:2019-01-28 12:57:12
【问题描述】:

This post 也有我的问题,但没有人回答。我在 mongodb 中有一个模型,其中包含一些字段,其中一个名为 synced,这是一个布尔字段。 使用下面的代码,我想更新一个(或一些小的更改不止一个)文档的“同步”字段:

db.bulk_write([UpdateOne({'content_id': '6101-1514301051'}, {'$set': {'synced': True}})]).bulk_api_result

但结果显示找到了一个匹配的文档,但没有更新:

{'writeErrors': [],
 'writeConcernErrors': [],
 'nInserted': 0,
 'nUpserted': 0,
 'nMatched': 1,
 'nModified': 0,
 'nRemoved': 0,
 'upserted': []}

当我只对另一个字段执行相同操作时,我得到了正确答案并且成功应用了更新:

db.bulk_write([UpdateOne({'content_id': '6101-1514301051'}, {'$set': {'visit': 14201}})]).bulk_api_result 
{'writeErrors': [],
 'writeConcernErrors': [],
 'nInserted': 0,
 'nUpserted': 0,
 'nMatched': 1,
 'nModified': 1,
 'nRemoved': 0,
 'upserted': []}

我的代码有什么问题,如何将更改应用到 synced 归档?

更多信息:

我也用 mongo-shell 做同样的事情:

> db.my_model_name.updateOne({"content_id": "6101-1514301051"}, {$set: {"synced": true}})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 0 }

或与

> db.telegram_post_model.update({"content_id": "6101-1514301051"}, {$set: {"synced": true}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })

但仍然无法更新文档。

【问题讨论】:

  • 您能否提供该数据库中的文档示例?
  • 在第一个示例中,content_id 与您的查询匹配('nMatched': 1),但 'synced' 已经具有值 True ,因此实际上没有数据更改('nModified': 0)。但在第二个示例中,“访问”值已更新,因此“nModified”:1

标签: mongodb pymongo


【解决方案1】:

以下代码对我很有用:

from pymongo import MongoClient
db = MongoClient("mongodb://login:password@server:port/database_name").get_default_database()
db.telegram_post_model.update({"content_id": "6101-1514301051"}, {"$set": {"synced": True}})

【讨论】:

  • 我也在 mongo shell 中这样做,但这不是答案
  • 好的,另一个选项文档没有被修改,因为它已经包含那个值或类似的东西。从代码/查询视图来看,一切都是正确的。也许你有一些代码在同一个数据库上运行,也许还有别的。但我不确定是否有人能猜到。
  • 顺便说一句,@EmadHelmi 你能在其他环境中,在另一个实例上的数据库副本上重现这个问题吗?
猜你喜欢
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
相关资源
最近更新 更多