2015-08-31 19 views
8

Hi così ho questo dati di test a Mongo per mongoengine che uso per la memorizzazione della spesa dell'utente:Raggruppamento nella mongoengine EmbeddedDocumentListField

{ 
    "_id" : ObjectId("55e492ac516ddc17a8b07d2a"), 
    "user" : ObjectId("55e3f236516ddc78296968be"), 
    "items" : [ 
     { 
      "item" : ObjectId("55e24cd6516ddcbdc081842b"), 
      "quantity" : 2, 
      "added_date" : ISODate("2015-08-31T17:44:49.023Z") 
     }, 
     { 
      "item" : ObjectId("55e24cd6516ddcbdc0818425"), 
      "quantity" : 3, 
      "added_date" : ISODate("2015-08-31T17:44:49.025Z") 
     }, 
     { 
      "item" : ObjectId("55e24cd6516ddcbdc0818420"), 
      "quantity" : 3, 
      "added_date" : ISODate("2015-08-31T17:44:49.026Z") 
     } 
    ] 
} 

Ecco i modelli:

class CartItem(mongoengine.EmbeddedDocument): 
    item = mongoengine.ReferenceField('Item') 
    quantity = mongoengine.IntField() 
    added_date = mongoengine.DateTimeField(default=datetime.now()) 

class Cart(mongoengine.Document): 
    user = mongoengine.ReferenceField('User') 
    items = mongoengine.EmbeddedDocumentListField(CartItem) 

Qui devo conservare gli elementi in carrello dell'utente. Ora vorrei ottenere tutti gli oggetti unici nel campo dell'elenco degli articoli perché ci saranno oggetti duplicati.

ho eseguire le seguenti query per ottenere gli elementi:

cart = Cart.objects.filter(user=user).first() 
queryset = cart.items 

In questo caso penso che avrei dovuto raggruppare gli elementi, ho provato ad utilizzare interrogazione prime filtro: cart.items.filter(__raw__...) Ma questo semplicemente non funziona perché raw non è supportato in questo caso. Qualcuno può aiutarmi per come posso farlo? Grazie!

risposta

4

È possibile utilizzare .distinct() per ottenere tutti i valori unici diitems invece di fare groupby.

Restituisce un elenco di valori distinti per un determinato campo.

Hai bisogno di fare qualcosa di simile:

unique_items = Cart.objects.filter(user=user).first().distinct('items') 

Questo restituirà un elenco di unico items in un carrello per un particolare utente.

EDIT:

Se si desidera un elenco unico di item campo all'interno del campo documento incorporato items, allora avete bisogno di utilizzare dot . di andare a quel campo.

Cart.objects.filter(user=user).first().distinct('items.item') 
+1

È fantastico! Grazie! L'unica cosa che ho cambiato è .distinct ('items.item') – Nazariy1995

+0

Felice di aiutare! Ho incluso lo stesso in ans. –

Problemi correlati