Sto tentando di creare un servizio Web utilizzando MongoDB e Flask (utilizzando il driver pymongo). Una query al database restituisce i documenti con il campo "_id" incluso, ovviamente. Non voglio inviare questo al client, quindi come lo rimuovo?Rimozione di _id elemento dai risultati Pymongo
Ecco un percorso Flask:
@app.route('/theobjects')
def index():
objects = db.collection.find()
return str(json.dumps({'results': list(objects)},
default = json_util.default,
indent = 4))
Ciò restituisce:
{
"results": [
{
"whatever": {
"field1": "value",
"field2": "value",
},
"whatever2": {
"field3": "value"
},
...
"_id": {
"$oid": "..."
},
...
}
]}
ho pensato che fosse un dizionario e ho potuto solo eliminare l'elemento prima di restituirlo:
del objects['_id']
Ma ciò restituisce un TypeError:
TypeError: 'Cursor' object does not support item deletion
Quindi non è un dizionario, ma qualcosa che devo ripetere con ogni risultato come dizionario. Quindi cerco di farlo con questo codice:
for object in objects:
del object['_id']
Ogni dizionario oggetto appare il modo in cui mi piacerebbe che ad oggi, ma il cursore oggetti è vuota. Quindi cerco di creare un nuovo dizionario e dopo l'eliminazione di ogni _id, aggiungo un nuovo dizionario che Flask tornerà:
new_object = {}
for object in objects:
for key, item in objects.items():
if key == '_id':
del object['_id']
new_object.update(object)
Questo restituisce solo un dizionario con i tasti di primo livello e nient'altro.
Quindi questo è un problema di dizionari nidificati standard, ma sono anche scioccato dal fatto che MongoDB non abbia un modo per affrontarlo facilmente.
Il MongoDB documentation spiega che è possibile escludere con _id
{ _id : 0 }
Ma questo non fa nulla con pymongo. Lo Pymongo documentation spiega che è possibile elencare i campi che si desidera vengano restituiti, ma "(" _id "sarà sempre incluso)". Sul serio? Non c'è modo di aggirare questo? C'è qualcosa di semplice e stupido che sto trascurando qui?
Qual è la tua richiesta effettiva qui? Il tuo codice per la creazione di un nuovo dict è strano e non necessario. Qual è il tuo vero problema? –
Il mio problema era che .find ({}, {'_id': False}) non escludeva _id. Tuttavia è stato un problema con il mio codice e ora funziona. Grazie per l'aiuto. – ddw
"ma il cursore degli oggetti è vuoto": questo perché è possibile ripetere l'iterazione solo una volta, quindi è necessario eseguire iterazioni, ottenere dettato successivo, rimuovere '_id', inserire dict in una lista e alla fine restituire l'elenco, non oggetti. –