Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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 Pymongo-Mod on_id不允许_Python_Mongodb_Pymongo - Fatal编程技术网

Python Pymongo-Mod on_id不允许

Python Pymongo-Mod on_id不允许,python,mongodb,pymongo,Python,Mongodb,Pymongo,我有一个需要更新的Mongo集合,我尝试使用Collection.update命令但没有效果 代码如下: import pymongo from pymongo import MongoClient client = MongoClient() db = client.SensorDB sensors = db.Sensor for sensor in sensors.find(): lat = sensor['location']['latitude'] lng = sens

我有一个需要更新的Mongo集合,我尝试使用Collection.update命令但没有效果

代码如下:

import pymongo
from pymongo import MongoClient
client = MongoClient()
db = client.SensorDB
sensors = db.Sensor

for sensor in sensors.find():
    lat = sensor['location']['latitude']
    lng = sensor['location']['longitude']
    sensor['location'] = {
        "type" : "Feature",
        "geometry" : {
            "type" : "Point",
            "coordinates" : [lat ,lng]
        },
        "properties": {
            "name": sensor['name']
        }
    }

    sensors.update({'webid': sensor['webid']} , {"$set": sensor}, upsert=True)
但是,运行此命令会让我得到以下结果:

Traceback (most recent call last):
  File "purgeDB.py", line 21, in <module>
    cameras.update({'webid': sensor['webid']} , {"$set": sensor}, upsert=True)
  File "C:\Anaconda\lib\site-packages\pymongo\collection.py", line 561, in update
    check_keys, self.uuid_subtype), safe)
  File "C:\Anaconda\lib\site-packages\pymongo\mongo_client.py", line 1118, in _send_message
    rv = self.__check_response_to_last_error(response, command)
  File "C:\Anaconda\lib\site-packages\pymongo\mongo_client.py", line 1060, in __check_response_to_last_error
    raise OperationFailure(details["err"], code, result)
pymongo.errors.OperationFailure: Mod on _id not allowed
回溯(最近一次呼叫最后一次):
文件“purgeDB.py”,第21行,在
更新({'webid':sensor['webid']},{“$set”:sensor},upsert=True)
更新中第561行的文件“C:\Anaconda\lib\site packages\pymongo\collection.py”
检查_键,self.uuid_子类型),安全)
文件“C:\Anaconda\lib\site packages\pymongo\mongo\u client.py”,第1118行,在发送消息中
rv=自身。检查响应到最后一个错误(响应,命令)
文件“C:\Anaconda\lib\site packages\pymongo\mongo\u client.py”,第1060行,在\uu check\u response\u to \u last\u error中
raise操作失败(详细信息[“错误”]、代码、结果)
pymongo.errors.OperationFailure:不允许使用id上的Mod
更改此行:

for sensor in sensors.find():
为此:

for sensor in sensors.find({}, {'_id': 0}):
这样做的目的是防止Mongo返回
\u id
字段,因为您没有使用该字段,并且由于您无法“更新”
\u id
而导致以后在
update()
调用中出现问题


更好的解决方案(只写需要的数据)

编辑: 正如Loïc Faure Lacroix所提到的,在您的案例中,您也不需要
upsert
标志-在这种情况下,您的代码总是在更新,从不插入

Edit2: 第一个解决方案的引号中包含了
\u id

更改此行:

for sensor in sensors.find():
为此:

for sensor in sensors.find({}, {'_id': 0}):
这样做的目的是防止Mongo返回
\u id
字段,因为您没有使用该字段,并且由于您无法“更新”
\u id
而导致以后在
update()
调用中出现问题


更好的解决方案(只写需要的数据)

编辑: 正如Loïc Faure Lacroix所提到的,在您的案例中,您也不需要
upsert
标志-在这种情况下,您的代码总是在更新,从不插入

Edit2:
\u id
括在第一个解决方案的引号中。

不能更新对象的“\u id”。不能更新对象的“\u id”。也不需要upsert标志。它应该被删除,因为不应该创建新文档。此外,
new_doc=copy.deepcopy(mongo_doc)
生成一个克隆的dict,您可以在
删除新文档[''u id']
后使用
进行编辑并向上插入,如果您的文档非常大,并且在编辑它们时会发生很多更改(例如,大用户配置文件)谢谢你的回答。更新投影以不返回
\u id
为我解决了问题。此外,不需要upsert标志。它应该被删除,因为不应该创建新文档。此外,
new_doc=copy.deepcopy(mongo_doc)
生成一个克隆的dict,您可以在
删除新文档[''u id']
后使用
进行编辑并向上插入,如果您的文档非常大,并且在编辑它们时会发生很多更改(例如,大用户配置文件)谢谢你的回答。更新投影以不返回
\u id
为我解决了问题。