Group in in mongoengine EmbeddedDocumentListField

时间:2015-08-31 18:02:43

标签: python django mongodb mongoengine embedded-documents

嗨所以我在mongo for mongoengine中有这个测试数据用于存储用户的购物车:

{
    "_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")
        }
    ]
}

这里的模型:

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)

这里我将商品存储在用户的购物车中。现在我想获取项目列表字段中的所有唯一项目,因为会有重复的项目。

我执行以下查询以获取项目:

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

在这种情况下,我认为我必须对项目进行分组,我尝试在过滤器中使用原始查询:cart.items.filter(__raw__...)但这不起作用,因为在这种情况下不支持raw。有人可以帮助我如何做到这一点?谢谢!

1 个答案:

答案 0 :(得分:4)

您可以使用.distinct()获取items的所有唯一值,而不是groupby

  

返回给定字段的不同值列表。

您需要执行以下操作:

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

这将在特定用户的购物车中返回唯一items的列表。

修改

如果您想在item嵌入文档字段中找到items字段的唯一列表,则需要使用点.转到该字段。

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