Использование "from" в качестве ключа kwarg в команде запуска pymongo
Я пытаюсь использовать pymongo для клонирования коллекции из удаленного экземпляра mongo, поскольку в документации для клонирования коллекции требуется cloneCollection
команда,
{ cloneCollection: "<collection>", from: "<hostname>", query: { <query> } }
и для запуска этой команды в pymongo мне нужно указать дополнительные параметры команды в виде kwargs, например:
db.command("cloneCollection","db_name.collection_name", from = "localhost:27017")
Но с тех пор from
является зарезервированным ключевым словом в Python, я не могу использовать его в качестве ключевого слова. Альтернатива - передать команду как python dict, как это:
db.command({"cloneCollection":"db_name.collection_name", "from":"localhost:27017"})
Однако в этом случае порядок не сохраняется, и я получаю эту ошибку
pymongo.errors.OperationFailure: command {'from': 'localhost:27017', 'cloneCollection': 'db_name.collection_name'} failed: no such cmd: from
2 ответа
В зависимости от того, как pymongo использует словарь, вы можете использовать OrderedDict (из модуля встроенных коллекций). Это доступно только с Python 2.7, но есть и обратные порты для Python 2.4 и выше.
В этом случае вы можете сделать что-то вроде:
from collections import OrderedDict
config = OrderedDict((
("cloneCollection", "db_name.collection_name"),
("from", "localhost:27017"),
))
db.command(config)
Поняв, что я могу использовать bson.son.SON для создания объекта SON (подкласс dict, который поддерживает порядок ключей), pymongo также делает это внутренне, когда мы передаем аргументы или python dict командам pymongo,
from bson.son import SON
db.command(SON([("cloneCollection","db_name.collection_name"), ("from","localhost:27017")]))