【发布时间】:2021-11-26 20:02:15
【问题描述】:
我正在尝试创建一个包含两个集合的 MongoDB 数据库:学生和课程。
第一个集合“学生”包含:
from pymongo import MongoClient
import pprint
client = MongoClient("mongodb://127.0.0.1:27017")
db = client.Database
student = [{"_id":"0",
"firstname":"Bert",
"lastname":"Holden"},
{"_id":"1",
"firstname":"Sam",
"lastname":"Olsen"},
{"_id":"2",
"firstname":"James",
"lastname":"Swan"}]
students = db.students
students.insert_many(student)
pprint.pprint(students.find_one())
第二个集合“课程”包含:
from pymongo import MongoClient
import pprint
client = MongoClient("mongodb://127.0.0.1:27017")
db = client.Database
course = [{"_id":"10",
"coursename":"Databases",
"grades":"[{student_id:0, grade:83.442}, {student_id:1, grade:45.323}, {student_id:2, grade:87.435}]"}]
courses = db.courses
courses.insert_many(course)
pprint.pprint(courses.find_one())
然后我想使用聚合来查找学生和相应的课程和成绩。
from pymongo import MongoClient
import pprint
client = MongoClient("mongodb://127.0.0.1:27017")
db = client["Database"]
pipeline = [
{
"$lookup": {
"from": "courses",
"localField": "_id",
"foreignField": "student_id",
"as": "student_course"
}
},
{
"$match": {
"_id": "0"
}
}
]
pprint.pprint(list(db.students.aggregate(pipeline)))
我不确定 student_id/grade 是否在“课程”集合中正确实施,所以这可能是我的arregation 返回 [] 的原因之一。
如果我为每个学生创建单独的课程,聚合就可以工作,但这似乎很浪费内存,所以我希望有一门课程包含一个数组中的所有 student_ids 和成绩。
预期输出:
[{'_id': '0',
'firstname': 'Bert',
'lastname': 'Holden',
'student_course': [{'_id': '10',
'coursename': 'Databases',
'grade': '83.442',
'student_id': '0'}]}]
【问题讨论】:
-
为什么将成绩保存为字符串而不是对象?
-
我不确定。你愿意解释一下吗? :)
-
抱歉,直到现在我无法深入了解。我已经发布了一个答案(即使您已经找到了一个有效的答案)。
标签: python database mongodb reference