2015-08-30 7 views
5

ho questo documento nel motore di Mongo:tirare da una lista in un dict utilizzando mongoengine

class Mydoc(db.Document): 
    x = db.DictField() 
    item_number = IntField() 

E ho questo dati nel documento

{ 
    "_id" : ObjectId("55e360cce725070909af4953"), 
    "x" : { 
     "mongo" : [ 
      { 
       "list" : "lista" 
      }, 
      { 
       "list" : "listb" 
      } 
     ], 
     "hello" : "world" 
    }, 
    "item_number" : 1 
} 

Ok se voglio spingere per mongo elenco utilizzando mongoengine, faccio questo:

Mydoc.objects(item_number=1).update_one(push__x__mongo={"list" : "listc"}) 

che funziona abbastanza bene, se una query al database di nuovo ottengo questo

{ 
    "_id" : ObjectId("55e360cce725070909af4953"), 
    "x" : { 
     "mongo" : [ 
      { 
       "list" : "lista" 
      }, 
      { 
       "list" : "listb" 
      }, 
      { 
       "list" : "listc" 
      } 
     ], 
     "hello" : "world" 
    }, 
    "item_number" : 1 
} 

ma quando provo a tirare da stessa lista con trazione a motore di Mongo:

Mydoc.objects(item_number=1).update_one(pull__x__mongo={'list': 'lista'}) 

ottengo questo errore:

mongoengine.errors.OperationError: Update failed (Cannot apply $pull to a non-array value)

comparising le frasi:

Mydoc.objects(item_number=1).update_one(push__x__mongo={"list" : "listc"}) # Works 
Mydoc.objects(item_number=1).update_one(pull__x__mongo={"list" : "listc"}) # Error 

Come posso tirare da questa lista?

Apprezzo tutto l'aiuto

risposta

1

Credo che il problema è che mongoengine non conosce la struttura del documento x. L'hai dichiarato come DictField, quindi mongoengine pensa che tu stia tirando da DictField non da ListField. Dichiarare x come ListField ed entrambe le query dovrebbero funzionare correttamente.

suggerisco si dovrebbe anche creare un problema per questo:
https://github.com/MongoEngine/mongoengine/issues

Per risolvere il problema, è possibile utilizzare una query grezzo:

Mydoc.objects(item_number=1).update_one(__raw__={'$pull': {'x.mongo': {'list': 'listc'}}}) 
+0

Grazie, __raw__ funziona piuttosto bene, anche meglio usare la sintassi di mongodb. – oskararenas

Problemi correlati