2012-09-10 12 views
16

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?

+0

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? –

+0

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

+0

"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. –

risposta

53

escludere il settore _id in una query trovare in pymongo, è possibile utilizzare:

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

La documentazione è un po ' in questo caso il messaggio è vuoto, poiché il campo _id è sempre incluso.Ma puoi escluderlo come mostrato sopra.

+0

Grazie, questo è corretto. Avevo provato questo prima di postare ma immagino ci fosse un problema con la stringa che stavo passando nel primo parametro. L'ho risolto e ora tutto va bene. – ddw

2

Si sta chiamando

del objects['_id'] 

sull'oggetto del cursore!

L'oggetto del cursore è ovviamente un iterabile rispetto al set di risultati e non un singolo documento che è possibile manipolare.

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

è probabilmente quello che vuoi.

Quindi il vostro reclamo è completamente sbagliato, come nel codice seguente:

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} 
+0

Sì, ho provato anche il tuo codice prima di postare in origine. Ma come potrei combinare questi dizionari nidificati in un dizionario che può essere passato al cliente? Inoltre, mi sono reso conto che stavo cercando di delare su un oggetto cursore, ecco perché ho detto "Quindi non è un dizionario, ma qualcosa che deve scorrere su ogni risultato come un dizionario." Forse avrei dovuto lasciare fuori il mio processo di scoperta, ma ho pensato che più informazioni sono e meglio è. – ddw

Problemi correlati