Estoy intentando crear un servicio web usando MongoDB y Flask (usando el controlador pymongo). Una consulta a la base de datos devuelve documentos con el campo "_id" incluido, por supuesto. No quiero enviar esto al cliente, entonces, ¿cómo lo elimino?Eliminando el elemento _id de los resultados de Pymongo
Aquí es una ruta Frasco:
@app.route('/theobjects')
def index():
objects = db.collection.find()
return str(json.dumps({'results': list(objects)},
default = json_util.default,
indent = 4))
Esto devuelve:
{
"results": [
{
"whatever": {
"field1": "value",
"field2": "value",
},
"whatever2": {
"field3": "value"
},
...
"_id": {
"$oid": "..."
},
...
}
]}
me pareció que era un diccionario y tan sólo pudiera eliminar el elemento antes de devolverlo:
del objects['_id']
Pero eso devuelve un TypeError:
TypeError: 'Cursor' object does not support item deletion
Así que no es un diccionario, sino algo que tengo que repetir con cada resultado como un diccionario. Así que trato de hacer eso con este código:
for object in objects:
del object['_id']
Cada diccionario de objetos se ve la forma en que me gustaría que ahora, pero el cursor objetos está vacía. Así que trato de crear un nuevo diccionario y después de eliminar _id de cada uno, añadir a un nuevo diccionario que volverá Frasco:
new_object = {}
for object in objects:
for key, item in objects.items():
if key == '_id':
del object['_id']
new_object.update(object)
Esto sólo devuelve un diccionario con las teclas de primer nivel y nada más.
Así que este es un tipo de problema de diccionarios anidados estándar, pero también estoy sorprendido de que MongoDB no tenga una forma de lidiar fácilmente con esto.
El MongoDB documentation explica que puede excluir _id con
{ _id : 0 }
Pero eso no hace nada con pymongo. El Pymongo documentation explica que puede enumerar los campos que desea devolver, pero "(" _id "siempre se incluirá)". ¿Seriamente? ¿Hay forma de evitar esto? ¿Hay algo simple y estúpido que estoy pasando por alto aquí?
¿Cuál es su reclamo real aquí? Tu código para crear un nuevo dict es extraño y no es necesario. ¿Cuál es tu problema real? –
Mi problema era que .find ({}, {'_id': False}) no excluía _id. Sin embargo, era un problema con mi código y ahora está funcionando. Gracias por tu ayuda. – ddw
"pero el cursor de objetos está vacío": eso se debe a que puede iterar solo una vez, por lo que necesitaría iterar, obtener la siguiente dicción, eliminar '_id', poner dict en una lista, y al final devolver esa lista, no objetos. –