$group $sum聚合不返回任何内容



我有一个查询,当它直接在MongoDB中执行时,它会按预期运行,但是在尝试通过MongoEngine使其工作时遇到了一些麻烦。事实上,它什么也不返回。

在MongoDB上查询(工作正常):

db.annual_account.aggregate([{ $group: { "_id":"$adress.city", "total"{$sum: 1} }} ])

结果(这是我所期望的):

{ "_id" : "Genk", "total" : 1 }
{ "_id" : "Ottignies-Louvain-la-Neuve", "total" : 1 }
{ "_id" : "Ganshoren", "total" : 1 }
{ "_id" : "Mont-de-l'Enclus", "total" : 1 }
{ "_id" : "Charleroi", "total" : 1 }

现在,我在 views.py 中对MongoEngine的查询:

class StatisticsView(generics.ListAPIView):
serializer_class = AnnualAccountSerializer
def get_queryset(self):
group = {"$group" : {"_id": "$adress.city", "total": {"$sum":1} } }
response = AnnualAccount.objects.aggregate(group)
return response

结果:

HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
[
{},
{},
{},
{},
{},
]

请问有人知道出了什么问题吗?为什么我在 shell Mongo 和 MongoEngine 之间没有相同的结果?

谢谢

西蒙

编辑1

我已经创建了一个简单的测试示例,但仍然没有任何回报:

Model.py:

class Adress(EmbeddedDocument):
city = StringField()
class User(Document):
name = StringField()
adress = EmbeddedDocumentField(Adress)

Serializer.py:

class UserSerializer(serializers.DocumentSerializer):
class Meta:
model = User
fields = '__all__'

Views.py:

class UserView(generics.ListAPIView):
serializer_class = UserSerializer
def get_queryset(self):
group = {"$group": {"_id":"$adress.city", "total":{"$sum":1}}}
response = User.objects.aggregate(group)
return response

我三重检查我是否有一个名为"user"的集合和相应的字段。 如果我不使用"$group",我将显示我的数据。似乎问题来自"$group"运算符,但这很奇怪,我没有任何解释。 以下是我使用的版本:

Django                            1.11.17
django-rest-framework-mongoengine 3.3.1
djangorestframework               3.7.7
mongoengine                       0.11.0
pymongo                           3.8.0

您的代码看起来正确,我可以通过以下简单示例获得结果

class Adress(EmbeddedDocument):
city = StringField()
class AnnualAccount(Document):
adress = EmbeddedDocumentField(Adress)
AnnualAccount(adress=Adress(city='A')).save()
AnnualAccount(adress=Adress(city='B')).save()
group = {"$group" : {"_id": "$adress.city", "total": {"$sum":1} } }
print(list(AnnualAccount.objects.aggregate(group)))
## [{u'_id': u'B', u'total': 1}, {u'_id': u'A', u'total': 1}]

最新更新