我有一个查询,当它直接在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}]