Python 如何在MongoEngine中引用一对多&x2013–;在模式和聚合输出中(新手)

Python 如何在MongoEngine中引用一对多&x2013–;在模式和聚合输出中(新手),python,mongodb,pymongo,mongoengine,Python,Mongodb,Pymongo,Mongoengine,我试图输出一个类(来自类模型)及其引用的学生——学习mongoengine和mongodb。下面的代码给出了错误 Expected 'pipeline' to be BSON docs (or equivalent), but got [] 我相信这是显而易见的——对于那些了解mongo和mongoengine的人来说。任何帮助(或推动正确的方向)都将受到感谢:)提前感谢 import urllib from mongoengine import * connect(db=DB_NAME,

我试图输出一个类(来自类模型)及其引用的学生——学习mongoengine和mongodb。下面的代码给出了错误

Expected 'pipeline' to be BSON docs (or equivalent), but got []
我相信这是显而易见的——对于那些了解mongo和mongoengine的人来说。任何帮助(或推动正确的方向)都将受到感谢:)提前感谢

import urllib
from mongoengine import *


connect(db=DB_NAME, username=DB_USER, password=DB_PASSWORD,
        host=DB_URI)

class Students(Document):
    student_id = IntField(unique=True)  
    name = StringField(max_length=50)
    age = IntField(max_length=2)
    gender = StringField(choices=('male', 'female'))


class Classes(Document):
    class_id = IntField(required=True, unique=True)  # 1576407600000
    student_roster = ListField(ReferenceField(Students))


Students.objects.insert([
    Students(name="John", student_id=425736, age=10, gender="male"),
    Students(name="Mary", student_id=114391, age=9, gender="female")
])

Classes(class_id=1576407600000, student_roster=[425736, 114391]).save()


# gives pipeline error
c = Classes.objects.aggregate([
    {'$lookup': {'from': 'students',
            'localField' : 'student_roster',
            'foreignField' : 'student_id',
            'as': 'studentData'
    }
}
])
list(c)
如果我指的是:

您使用的是
objects
成员,而不是
objects()
成员,并且您正在传递一个
列表
,它希望将其解压到
dict
参数中(
*管道
,在这里您放置了与
管道
)谢谢您的提示:)我将建立在您所拥有的基础上。我来自SQL,并试图了解Mongo的关系数据库的“聚合/引用”版本。在您的示例中,我需要将“Bob and John”(具有唯一分配的公司id——而不是mongo的_id)分配给一家公司,这将更接近于在课堂场景中模拟我的学生。谢谢你朝着正确的方向轻推。
class Person(Document):
    name = StringField()

Person(name='John').save()
Person(name='Bob').save()

pipeline = [
    {"$sort" : {"name" : -1}},
    {"$project": {"_id": 0, "name": {"$toUpper": "$name"}}}
    ]
data = Person.objects().aggregate(*pipeline)
assert data == [{'name': 'BOB'}, {'name': 'JOHN'}]