8

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

{
    "_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__...) 但这不起作用,因为在这种情况下不支持原始查询。有人可以帮助我如何做到这一点吗?谢谢!

4

1 回答 1

5

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

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

您需要执行以下操作:

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

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

编辑:

如果您想要嵌入文档字段中的唯一字段列表itemitems则需要使用 dot.转到该字段。

Cart.objects.filter(user=user).first().distinct('items.item')
于 2015-08-31T18:46:13.170 回答