Удалить атрибут из всех документов MongoDB с помощью Python и PyMongo

В моем MongoDB существует куча этих документов:

{ "_id" : ObjectId("5341eaae6e59875a9c80fa68"),
  "parent" : {
      "tokeep" : 0,
      "toremove" : 0
  }
}

Я хочу удалить атрибут parent.toremove в каждом из них.

Используя оболочку MongoDB, я могу выполнить это, используя:

db.collection.update({},{$unset: {'parent.toremove':1}},false,true)

Но как это сделать в Python?

app = Flask(__name__)
mongo = PyMongo(app)
mongo.db.collection.update({},{$unset: {'parent.toremove':1}},false,true)

возвращает следующую ошибку:

  File "myprogram.py", line 46
mongo.db.collection.update({},{$unset: {'parent.toremove':1}},false,true)
                               ^
SyntaxError: invalid syntax

Ответ 1

Поместите кавычки вокруг $unset, назовите параметр, который вы включаете (multi), и используйте правильный синтаксис для true:

mongo.db.collection.update({}, {'$unset': {'parent.toremove':1}}, multi=True)

Ответ 2

Просто было странно добавлять произвольное значение для поля, которое нужно удалить, например, небольшое число (1), пустую строку ('') и т.д., Но это действительно упоминалось в документации MongoDB, с примером в JavaScript:

$unset

Оператор $ unset удаляет определенное поле. Рассмотрим следующий синтаксис:

{ $unset: { field1: "",... } }

Указанное значение в выражении $ unset (т.е. "") не влияет операция.

Для Python/PyMongo я хотел бы указать значение None:

{'$unset': {'field1': None}}

Итак, для вопроса ОП это будет:

mongo.db.collection.update({}, {'$unset': {'parent.toremove': None}}, multi=True)