如何解决使用Pymongo删除字段
我没有足够的声誉来发表评论,因此我不得不再次提出这个问题。
我尝试了多种方法来删除此处动态更改的日期列,但对我没有任何帮助:How to remove a field completely from a MongoDB document?
Environment_Details-操作系统:Windows10,pymongo:3.10.1,MongoDB Compass App:4.4,python:3.6
我正在尝试删除“ 2020/08/24”列(此日期对于我来说是动态的)。我的数据如下:
[{
"_id": {
"$oid": "5f4e4dda1031d5b55a3adc70"
},"Site": "ABCD","2020/08/24": "1","2020/08/25": "1.0"
},{
"_id": {
"$oid": "5f4e4dda1031d5b55a3adc71"
},"Site": "EFGH","2020/08/25": "0.0"
}]
不会引发任何错误但也不会删除列/字段“ 2020/08/24”的命令:
col_name = "2020/08/24"
db.collection.update_many({},{"$unset": {f"{col_name}":1}})
db.collection.update({},{"$unset": {f"{col_name}":1}},False,True)
db.collection.update_many({},query =[{ '$unset': [col_name] }])
在尝试使用带有更新选项的multi:True时,我总是遇到错误。
我使用的确切代码是:
import pymongo
def connect_mongo(host,port,db):
conn = pymongo.MongoClient(host,port)
return conn[db]
def close_mongo(host,port):
client = pymongo.MongoClient(host,port)
client.close()
def delete_mongo_field(db,collection,col_name,host,port):
"""Delete column/field from a collection"""
db = connect_mongo(host,db)
db.collection.update_many({},{"$unset": {f"{col_name}":1}})
#db.collection.update_many({},{'$unset': {f'{col_name}':''}})
close_mongo(host,port)
col_to_delete = "2020/08/30"
delete_mongo_field(mydb,mycollection,col_to_delete,'localhost',27017)
解决方法
另外,您可能需要考虑更改数据模型以将日期存储为值而不是键,并且还考虑将其存储为本地日期对象,例如
import datetime
import pytz
db.testcollection.insert_many([
{
"Site": "ABCD","Dates": [
{
"Date": datetime.datetime(2020,8,24,tzinfo=pytz.UTC),"Value": "1"
},{
"Date": datetime.datetime(2020,25,"Value": "1.0"
}]
},{
"Site": "EFGH","Dates": [
{
"Date": datetime.datetime(2020,"Value": "0.1"
}]
}])
但是回到您的问题...第一个例子对我来说很好。您可以尝试下面的示例代码,看看是否得到不同的结果:
from pymongo import MongoClient
import pprint
db = MongoClient()['testdatabase']
db.testcollection.insert_many([{
"Site": "ABCD","2020/08/24": "1","2020/08/25": "1.0"
},{
"Site": "EFGH","2020/08/25": "0.0"
}])
pprint.pprint(list(db.testcollection.find({},{'_id': 0})))
col_name = "2020/08/24"
db.testcollection.update_many({},{"$unset": {f"{col_name}": 1}})
pprint.pprint(list(db.testcollection.find({},{'_id': 0})))
结果:
[{'2020/08/24': '1','2020/08/25': '1.0','Site': 'ABCD'},{'2020/08/24': '1','2020/08/25': '0.0','Site': 'EFGH'}]
[{'2020/08/25': '1.0',{'2020/08/25': '0.0','Site': 'EFGH'}]
,
以下代码可用于Python 3.8,PyMongo 3.11。和MongoDB v 4.2.8。
col_name = '2020/08/24'
result = collection.update_many( { },{ '$unset': { col_name: '' } } )
print(result.matched_count,result.modified_count)
帖子中的两个文档已更新,名称为"2020/08/24"
的字段已删除。注意:MongoDB集合的文档可以具有带有/
字符的字段名称(请参见Documents - Field Names)。
[编辑添加]
以下delete_mongo_field
函数可通过删除提供的字段名称为我正确更新文档:
def delete_mongo_field(db,collection,col_name,host,port):
db = connect_mongo(host,port,db)
result = db[collection].update_many( { },{ '$unset': { col_name: 1 } } ) # you can also use '' instead of 1
print(result.modified_count)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。