MongoEngine:嵌入式文档中的阵列位置投影
问题描述:
我试图在没有太多成功的情况下使用MongoEngine在python中重现以下查询。MongoEngine:嵌入式文档中的阵列位置投影
用于数据和查询原始来源: http://docs.mongodb.org/manual/reference/projection/positional/#prj._S_
查询基本上返回嵌入文档中相匹配的第一元件,而不是整个嵌入的文档本身。
我的代码:
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'
任何帮助,将不胜感激!
答
我不确定mongoengine的语法,但我认为你不需要“唯一”位。
$位置指示器通常会从数组中获取相关值,听起来好像它会涉及到。
答
positional operator用于更新数组中与查询匹配的第一个元素。
查询语言是关于查找文档,目前您不能过滤文档中的数组。您可以切片并返回数组的一个子集,但不仅会返回一个匹配的子集。
所以在这种情况下,你必须筛选python中的成绩并作为循环的一部分。
另一种策略可能是使用aggregation framework来$展开数组和$匹配,然后重建等级数组 - 但这并不是mongoengine中的内容。
感谢您的回复。但是,mongodb [doc](http://docs.mongodb.org/manual/reference/projection/positional/)指出位置操作符用于选择数据和更新数据。我最终直接在MongoDB中执行这个查询。 – ducky