【问题标题】:MongoEngine: Array Positional Projection in Embedded documentMongoEngine:嵌入式文档中的数组位置投影
【发布时间】:2013-03-28 13:58:28
【问题描述】:

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

数据和查询的原始来源: 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'

任何帮助将不胜感激!

【问题讨论】:

    标签: python mongodb mongoengine


    【解决方案1】:

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

    $位置指示符一般会从数组中抓取相关值,听起来好像会涉及到。

    【讨论】:

      【解决方案2】:

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

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

      所以在这种情况下,您必须在 python 中过滤成绩,并将其作为循环的一部分。

      另一种策略可能是使用 aggregation framework 来 $unwind 数组和 $match 然后重建 Grades 数组 - 但目前 mongoengine 中没有内置。

      【讨论】:

      • 感谢您的回复。但是 mongodb doc 声明位置运算符用于选择数据以及更新数据。我最终直接在 mongodb 中进行了这个查询。
      猜你喜欢
      • 2017-08-22
      • 1970-01-01
      • 2013-07-26
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-21
      • 1970-01-01
      相关资源
      最近更新 更多