Я пытаюсь создать веб-службу, используя MongoDB и Flask (используя драйвер pymongo). Запрос к базе данных, конечно же, возвращает документы с включенным полем «_id». Я не хочу отправлять это клиенту, как мне его удалить?
Вот маршрут Flask:
@app.route('/theobjects')
def index():
objects = db.collection.find()
return str(json.dumps({'results': list(objects)},
default = json_util.default,
indent = 4))
Это возвращает:
{
"results": [
{
"whatever": {
"field1": "value",
"field2": "value",
},
"whatever2": {
"field3": "value"
},
...
"_id": {
"$oid": "..."
},
...
}
]}
Я думал, что это словарь, и я могу просто удалить элемент, прежде чем возвращать его:
del objects['_id']
Но это возвращает TypeError:
TypeError: 'Cursor' object does not support item deletion
Так что это не словарь, а что-то, что мне нужно перебирать с каждым результатом в виде словаря. Поэтому я пытаюсь сделать это с помощью этого кода:
for object in objects:
del object['_id']
Каждый словарь объектов выглядит так, как мне хотелось бы, но курсор объектов пуст. Поэтому я пытаюсь создать новый словарь и после удаления _id из каждого добавить в новый словарь, который вернет Flask:
new_object = {}
for object in objects:
for key, item in objects.items():
if key == '_id':
del object['_id']
new_object.update(object)
Это просто возвращает словарь с ключами первого уровня и ничего больше.
Так что это своего рода стандартная проблема вложенных словарей, но я также шокирован тем, что MongoDB не может легко с этим справиться.
В документации MongoDB объясняется, что вы можете исключить _id с помощью
{ _id : 0 }
Но это ничего не значит с пимонго. В документации Pymongo объясняется, что вы можете перечислить поля, которые вы хотите вернуть, но «(« _id »будет всегда включаться)». Шутки в сторону? Нет никакого способа обойти это? Есть ли что-то простое и глупое, на что я здесь не обращаю внимания?