在 mongoengine EmbeddedDocumentListField 中分组

Group By in mongoengine EmbeddedDocumentListField

你好所以我在 mongo 中有这个测试数据用于 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__...)但这不起作用,因为在这种情况下不支持原始查询。有人可以帮助我如何做到这一点吗?谢谢!

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

Return a list of distinct values for a given field.

您需要执行以下操作:

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

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

编辑:

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

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