pymongo 更新创建一个新记录而不更新
pymongo update creates a new record without upserting
我在对文档进行更新时遇到问题,但是更新会创建一个新文档,而我没有在我的更新中更新。
这是我的测试代码。
我通过检查“lastseen”是否不存在来查找文档是否存在:
result = DATA_Collection.find({"sessionID":"12345","lastseen":{"$exists":False}})
if result.count() == 1:
DATA_Collection.update({"sessionID":"12345"},{"$set":{"lastseen":"2021-05-07"}})
当我进行聚合检查以查找重复项时,我得到了一些,下面是一个示例。
> db.DATA_Collection.find({ "sessionID" : "237a5fb8" })
{ "_id" : ObjectId("60bdf7b05c961b4d27d33bde"), "sessionID" : "237a5fb8", "firstseen" : ISODate("1970-01-19T20:51:09Z"), "lastseen" : ISODate("2021-06-07T12:34:20Z") }
{ "_id" : ObjectId("60bdf7fa7d35ea0f046a2514"), "sessionID" : "237a5fb8", "firstseen" : ISODate("1970-01-19T20:51:09Z") }
我删除了集合中的所有记录并重新运行脚本,同样的事情再次发生。
任何建议将不胜感激。
首先,您的 pymongo 命令已被弃用;使用 update_one()
或 update_many()
而不是 update()
; count_documents()
而不是 count()
.
其次,请仔细检查您引用的集合是否与您提到的 DATA_Collection
和 VPN_DATA
;
相同
您如何定义“重复”?除非您在字段上创建唯一索引,否则记录不会重复,因为它们具有不同的 _id
字段。
你需要这样的东西:
record = db.VPN_DATA.find_one({'sessionID': '12345', 'lastseen': {'$exists': False}})
if record is not None:
db.VPN_DATA.update_one({'_id': record.get('_id')}, {'$set': {'lastseen': '2021-05-07'}})
我在对文档进行更新时遇到问题,但是更新会创建一个新文档,而我没有在我的更新中更新。
这是我的测试代码。 我通过检查“lastseen”是否不存在来查找文档是否存在:
result = DATA_Collection.find({"sessionID":"12345","lastseen":{"$exists":False}})
if result.count() == 1:
DATA_Collection.update({"sessionID":"12345"},{"$set":{"lastseen":"2021-05-07"}})
当我进行聚合检查以查找重复项时,我得到了一些,下面是一个示例。
> db.DATA_Collection.find({ "sessionID" : "237a5fb8" })
{ "_id" : ObjectId("60bdf7b05c961b4d27d33bde"), "sessionID" : "237a5fb8", "firstseen" : ISODate("1970-01-19T20:51:09Z"), "lastseen" : ISODate("2021-06-07T12:34:20Z") }
{ "_id" : ObjectId("60bdf7fa7d35ea0f046a2514"), "sessionID" : "237a5fb8", "firstseen" : ISODate("1970-01-19T20:51:09Z") }
我删除了集合中的所有记录并重新运行脚本,同样的事情再次发生。
任何建议将不胜感激。
首先,您的 pymongo 命令已被弃用;使用 update_one()
或 update_many()
而不是 update()
; count_documents()
而不是 count()
.
其次,请仔细检查您引用的集合是否与您提到的 DATA_Collection
和 VPN_DATA
;
您如何定义“重复”?除非您在字段上创建唯一索引,否则记录不会重复,因为它们具有不同的 _id
字段。
你需要这样的东西:
record = db.VPN_DATA.find_one({'sessionID': '12345', 'lastseen': {'$exists': False}})
if record is not None:
db.VPN_DATA.update_one({'_id': record.get('_id')}, {'$set': {'lastseen': '2021-05-07'}})