Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 使用Pymongo删除字段_Python 3.x_Mongodb_Pymongo_Pymongo 3.x - Fatal编程技术网

Python 3.x 使用Pymongo删除字段

Python 3.x 使用Pymongo删除字段,python-3.x,mongodb,pymongo,pymongo-3.x,Python 3.x,Mongodb,Pymongo,Pymongo 3.x,我没有足够的声誉来评论,因此我不得不再次问这个问题 我尝试了不同的方法删除此处提到的动态更改日期列,但没有任何效果: 环境_详细信息-操作系统:Windows10,pymongo:3.10.1,MongoDB Compass应用程序:4.4,python:3.6 我正在尝试删除“2020/08/24”列(在我的情况下,该日期将是动态的)。我的数据如下所示: [{ "_id": { "$oid": "5f4e4dda1031d5

我没有足够的声誉来评论,因此我不得不再次问这个问题

我尝试了不同的方法删除此处提到的动态更改日期列,但没有任何效果:

环境_详细信息-操作系统:Windows10,pymongo:3.10.1,MongoDB Compass应用程序: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/24": "1",
  "2020/08/25": "0.0"
}]
不会引发任何错误但也不会删除列/字段“2020/08/24”的命令:

我总是在尝试使用multi:True with update选项时出错

我使用的确切代码是:

    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, port, 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, 0, 0, tzinfo=pytz.UTC),
                "Value": "1"
            },
            {
                "Date": datetime.datetime(2020, 8, 25, 0, 0, tzinfo=pytz.UTC),
                "Value": "1.0"
            }]
    },
    {
        "Site": "EFGH",
        "Dates": [
            {
                "Date": datetime.datetime(2020, 8, 24, 0, 0, tzinfo=pytz.UTC),
                "Value": "1"
            },
            {
                "Date": datetime.datetime(2020, 8, 25, 0, 0, tzinfo=pytz.UTC),
                "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/24": "1",
    "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', 'Site': 'ABCD'}, {'2020/08/25': '0.0', 'Site': 'EFGH'}]

在单独的注释中,您可能需要考虑更改数据模型以将日期存储为值而不是键,并考虑将它们存储为本机日期对象,例如

import datetime
import pytz

db.testcollection.insert_many([
    {
        "Site": "ABCD",
        "Dates":  [
            {
                "Date": datetime.datetime(2020, 8, 24, 0, 0, tzinfo=pytz.UTC),
                "Value": "1"
            },
            {
                "Date": datetime.datetime(2020, 8, 25, 0, 0, tzinfo=pytz.UTC),
                "Value": "1.0"
            }]
    },
    {
        "Site": "EFGH",
        "Dates": [
            {
                "Date": datetime.datetime(2020, 8, 24, 0, 0, tzinfo=pytz.UTC),
                "Value": "1"
            },
            {
                "Date": datetime.datetime(2020, 8, 25, 0, 0, tzinfo=pytz.UTC),
                "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/24": "1",
    "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', 'Site': 'ABCD'}, {'2020/08/25': '0.0', 'Site': 'EFGH'}]

以下代码与Python3.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集合的文档可以具有带有
/
字符的字段名(请参阅)


[编辑和添加]

以下
delete\u mongo\u 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)

以下代码与Python3.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集合的文档可以具有带有
/
字符的字段名(请参阅)


[编辑和添加]

以下
delete\u mongo\u 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)

我刚刚更新了这个问题,提到我是如何通过创建函数来使用这些查询的。奇怪的是,如果我按照你们两人建议的方式使用它们,它会起作用,但如果我在函数中使用它们,则什么也不会发生。你能告诉我我遗漏了什么吗?我在你的代码中用更正更新了答案。这对我很有效。另外要小心,您正在传递一个字符串
db
参数,然后将
db
参数设置为pymongo数据库对象。这在技术上并没有错,但是如果你做这样的事情,你会遇到一堆混乱。我刚刚更新了这个问题,提到我是如何通过创建函数来使用这些查询的。奇怪的是,如果我按照你们两人建议的方式使用它们,它会起作用,但如果我在函数中使用它们,则什么也不会发生。你能告诉我我遗漏了什么吗?我在你的代码中用更正更新了答案。这对我很有效。另外要小心,您正在传递一个字符串
db
参数,然后将
db
参数设置为pymongo数据库对象。从技术上讲,这并没有错,但如果你做那样的事情,你会陷入一堆困惑。谢谢。它很有魅力。从delete_mongo_字段函数中删除close_mongo函数有什么具体原因吗?您不需要关闭连接,pymongo会处理这个问题。事实上,最好不要这样做,因为重新打开它们会增加一些开销。谢谢。它起到了很好的作用。从delete_mongo_字段函数中删除close_mongo函数有什么具体原因吗?您不需要关闭连接,pymongo会处理这个问题。事实上,最好不要这样做,因为重新打开它们会增加大量开销。