Я пытаюсь создать веб-сервис, используя MongoDB и Flask (используя драйвер pymongo). Конечно, запрос к базе данных возвращает документы с включенным полем "_id". Я не хочу отправлять это клиенту, поэтому как его удалить?
Здесь маршрут фляжки:
@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" всегда будет включен) ". Шутки в сторону? Разве это не так? Есть что-то простое и глупое, что я здесь не замечаю?