mongoclient how example documentacion docs create allowdiskuse python mongodb pymongo

python - how - Eliminando el elemento_id de los resultados de Pymongo



pymongo docs python (3)

Estas llamando

del objects[''_id'']

en el cursor del objeto!

El objeto del cursor es obviamente un iterable sobre el conjunto de resultados y no un solo documento que pueda manipular.

for obj in objects: del obj[''_id'']

Es probable que lo que quieres.

Así que su reclamación es completamente errónea como lo muestra el siguiente código:

import pymongo c = pymongo.Connection() db = c[''mydb''] db.foo.remove({}) db.foo.save({''foo'' : 42}) for row in db.foo.find(): del row[''_id''] print row $ bin/python foo.py > {u''foo'': 42}

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?

Aquí hay una ruta matraz:

@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": "..." }, ... } ]}

Pensé que era un diccionario y solo podía eliminar el elemento antes de devolverlo:

del objects[''_id'']

Pero eso devuelve un TypeError:

TypeError: ''Cursor'' object does not support item deletion

Entonces 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 tiene el aspecto que quisiera, pero el cursor de los objetos está vacío. Así que trato de crear un nuevo diccionario y después de eliminar _id de cada uno, agrego a un nuevo diccionario que Flask devolverá:

new_object = {} for object in objects: for key, item in objects.items(): if key == ''_id'': del object[''_id''] new_object.update(object)

Esto solo devuelve un diccionario con las claves de primer nivel y nada más.

Así que esto es una especie de problema de diccionarios anidados estándar, pero también me sorprende que MongoDB no tenga una manera de lidiar fácilmente con esto.

La documentación de MongoDB explica que puede excluir _id con

{ _id : 0 }

Pero eso no hace nada con el pymongo. La documentación de Pymongo explica que puede enumerar los campos que desea que se devuelvan, pero "(" _id "siempre se incluirá)". ¿Seriamente? ¿No hay manera de evitar esto? ¿Hay algo simple y estúpido que estoy pasando por alto aquí?


La respuesta anterior falla si queremos campos específicos y aún ignoramos _id. Use lo siguiente en tales casos:

db.collection.find({''required_column_A'':1,''required_col_B'':1, ''_id'': False})


Para excluir el campo _id en una consulta de búsqueda en pymongo, puede usar:

db.collection.find({}, {''_id'': False})

La documentación es un tanto engañosa, ya que dice que el campo _id siempre está incluido. Pero puedes excluirlo como se muestra arriba.