2015-08-31 8 views
8

Hallo, so habe ich diese Testdaten in Mongo für mongoengine, die ich für die Speicherung von Benutzer-Warenkorb verwenden:Gruppierung in 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") 
     } 
    ] 
} 

Hier werden die Modelle:

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) 

Hier speichere ich Artikel in Einkaufswagen des Benutzers. Jetzt möchte ich alle eindeutigen Elemente im Listenfeld Elemente erhalten, da es doppelte Einträge geben wird.

ich die folgenden Abfragen die Elemente zu erhalten:

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

In diesem Fall denke ich, dass ich die Elemente in der Gruppe haben würde, habe ich versucht, roh Abfrage in Filter: cart.items.filter(__raw__...) Aber das funktioniert einfach nicht Weil Raw in diesem Fall nicht unterstützt wird. Kann mir bitte jemand helfen wie ich das machen kann? Vielen Dank!

Antwort

4

können Sie .distinct() verwenden, um alle eindeutigen Werte von items zu bekommen, anstatt groupby zu tun.

Gibt eine Liste eindeutiger Werte für ein bestimmtes Feld zurück.

Sie benötigen, wie etwas zu tun:

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

eine Liste der einzigartigen items in einem Wagen für einen bestimmten Benutzer Dies wird zurückkehren.

EDIT:

Wenn Sie eine einzigartige Liste von item Feld innerhalb des items eingebetteten Dokuments Feld wollen, dann müssen Sie Punkt verwenden . auf dieses Feld zu gehen.

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

Das ist großartig! Vielen Dank! Die einzige Sache, die ich änderte, ist .distinct ('items.item') – Nazariy1995

+0

Froh, zu helfen! Ich habe das gleiche in die ANS aufgenommen. –