Python MongoEngine:嵌入式文档中的数组位置投影

Python MongoEngine:嵌入式文档中的数组位置投影,python,mongodb,mongoengine,Python,Mongodb,Mongoengine,我试图使用MongoEngine在python中重现以下查询,但没有取得多大成功 数据和查询的原始来源: 查询基本上返回嵌入文档中匹配的第一个元素,而不是整个嵌入文档本身 我的代码: from mongoengine import * connect('test') class Student(Document): semester = IntField() grades = ListField(EmbeddedDocumentField('Grade')) class

我试图使用MongoEngine在python中重现以下查询,但没有取得多大成功

数据和查询的原始来源:

查询基本上返回嵌入文档中匹配的第一个元素,而不是整个嵌入文档本身

我的代码:

from mongoengine import *
connect('test')


class Student(Document):
    semester = IntField()
    grades = ListField(EmbeddedDocumentField('Grade'))


class Grade(EmbeddedDocument):
    value = FloatField()

    def __str__(self):
        return "%s" % self.value

student_1 = Student(semester=1, grades=[Grade(value=70), Grade(value=87), Grade(value=90)]).save()
student_2 = Student(semester=1, grades=[Grade(value=90), Grade(value=88), Grade(value=92)]).save()

result = Student.objects(semester=1, grades__value__gte=85).only("grades.$")

for r in result:
    print r.grades
当我这样做时,我会得到一个错误:

Traceback (most recent call last):
  File "test_me_so.py", line 21, in <module>
    result = Student.objects(semester=1, grades__value__gte=85).only("grades.$")
  File "/.../lib/python2.7/site-packages/mongoengine/queryset.py", line 1225, in only
    return self.fields(**fields)
  File "/.../lib/python2.7/site-packages/mongoengine/queryset.py", line 1271, in fields
    fields = self._fields_to_dbfields(fields)
  File "/.../lib/python2.7/site-packages/mongoengine/queryset.py", line 1289, in _fields_to_dbfields
    field = ".".join(f.db_field for f in QuerySet._lookup_field(self._document, field.split('.')))
  File "/.../lib/python2.7/site-packages/mongoengine/queryset.py", line 1289, in <genexpr>
    field = ".".join(f.db_field for f in QuerySet._lookup_field(self._document, field.split('.')))
AttributeError: 'str' object has no attribute 'db_field'
回溯(最近一次呼叫最后一次):
文件“test_me_so.py”,第21行,在
结果=学生。对象(学期=1,成绩值=85)。仅限(“成绩$”)
文件“/…/lib/python2.7/site packages/mongoengine/queryset.py”,第1225行,仅适用于
返回self.fields(**字段)
文件“/…/lib/python2.7/site packages/mongoengine/queryset.py”,第1271行,在字段中
字段=自身。\字段\u到\u数据库字段(字段)
文件“/…/lib/python2.7/site packages/mongoengine/queryset.py”,第1289行,在_fields到_dbfields中
field=“.”.join(查询集中f的f.db_字段。_查找_字段(self._文档,field.split(')))
文件“/…/lib/python2.7/site packages/mongoengine/queryset.py”,第1289行,在
field=“.”.join(查询集中f的f.db_字段。_查找_字段(self._文档,field.split(')))
AttributeError:'str'对象没有属性'db_field'

任何帮助都将不胜感激

我不确定mongoengine的语法,但我认为您不需要“only”位

$positional指示符通常从数组中获取相关的值,听起来好像它会参与其中。

用于更新数组中与查询匹配的第一个元素

查询语言是关于查找文档的,当前无法筛选文档中的数组。可以切片并返回数组的子集,但不能仅返回匹配的子集

因此,在本例中,您必须在python中过滤等级,并将其作为循环的一部分


另一种策略可能是使用$diswind数组和$match,然后重新生成grades数组,但目前mongoengine中没有这一功能。

感谢您的回复。但是mongodb声明位置操作符用于选择数据和更新数据。我直接在mongodb中完成了这个查询。