3

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'

どんな助けでも大歓迎です!

4

2 に答える 2

0

位置演算子は、クエリに一致する配列内の最初の要素を更新するためのものです。

クエリ言語はドキュメントの検索に関するものであり、現在、ドキュメント内の配列をフィルター処理することはできません。配列のサブセットをスライスして返すことができますが、一致したサブセットを返すだけではありません。

したがって、この場合、Python でループの一部として成績をフィルタリングする必要があります。

別の戦略として、集計フレームワークを使用して配列を $unwind し、$match してから grades 配列を再構築することもできますが、現時点では mongoengine に組み込まれていません。

于 2013-04-10T11:35:09.317 に答える
0

mongoengine の構文はよくわかりませんが、「唯一の」ビットは必要ないと思います。

$ 位置インジケーターは通常、配列から関連する値を取得します。

于 2013-03-28T18:58:25.180 に答える