Python MongoDB:如何将文档数组转换为单个文档?

Python MongoDB:如何将文档数组转换为单个文档?,python,mongodb,Python,Mongodb,本文件在“学校”收藏中。我一直在尝试使用 { "teachers" : [ {"name": "Lucy", "id": 3, course: "history"}, {"name": "Mark", "id": 6, "course": "maths"}, {"name": "Joan", "id": 20, course: "French"} ] } 我也试过了

本文件在“学校”收藏中。我一直在尝试使用

{
 "teachers" : [
               {"name": "Lucy", "id": 3, course: "history"}, 
               {"name": "Mark", "id": 6, "course": "maths"}, 
               {"name": "Joan", "id": 20, course: "French"} 
               ] 
}
我也试过了

db.school.find({teachers:{id:3}}) 
但我知道它不起作用,因为mongo无法查看嵌入式阵列内部。 因此,我想将这些嵌入的文档转换为单独的文档。也就是说,删除嵌入和“教师”键,为每个教师创建一个单独的文档

最终的“学校”收藏将是

db.school.find({teacher.id:3})

我想用python完成这项工作,并将新文档保存到一个集合中

编辑

这就是我目前的想法:

{"name": "Lucy", "id": 3, "course": "history"}, 
{"name": "Mark", "id": 6, "course": "maths"}, 
{"name": "Joan", "id": 20, "course": "French"}
这个怎么样


这是怎么回事?

您可以使用mongo v2.2+中的聚合命令(在pymongo中):

school_records = db.school.find()
for i in school_records:
    for teacher in i['teachers']:
        db.individual.insert(teacher)

您可以使用mongo v2.2+中的聚合命令(在pymongo中):

school_records = db.school.find()
for i in school_records:
    for teacher in i['teachers']:
        db.individual.insert(teacher)

顺便说一下,Mongodb可以找到数组中的嵌入文档:

    fagg=db.school.aggregate([{$unwind: "$teachers"},
    {$project: {name: "$teachers.name", 
    id: "$teachers.id", course: "$teachers.course"}}])
    fagg.result.forEach(function(o){
    db.teachers.insert({_id: o.id, name: o.name, course: o.course})})
您可以在上了解有关点表示法的更多信息

如果目标是仅返回嵌入文档,则可以使用请求:


顺便说一下,Mongodb可以找到数组中的嵌入文档:

    fagg=db.school.aggregate([{$unwind: "$teachers"},
    {$project: {name: "$teachers.name", 
    id: "$teachers.id", course: "$teachers.course"}}])
    fagg.result.forEach(function(o){
    db.teachers.insert({_id: o.id, name: o.name, course: o.course})})
您可以在上了解有关点表示法的更多信息

如果目标是仅返回嵌入文档,则可以使用请求:


问题是,;有没有可能把{“老师”{姓名:“露西”,身份证:3,课程:“历史”},{姓名:“马克”,身份证:6,课程:“数学”},{姓名:“琼”,身份证:20,课程:“法语”}变成{姓名:“露西”,身份证:3,课程:“历史”},{姓名:“马克”,身份证:6,课程:“数学”},{姓名:“琼”,身份证:20,课程:“法语”}我不明白。“可能”是什么意思?用python?使用mongodb控制台还是其他方式?我希望使用python来完成这项工作,并将新文档保存到一个集合中。抱歉,我不是很清楚。编写python脚本来进行数据库转换将是一种有效的方法。您也可以使用MongoShell,因为它是一个成熟的javascript解释器,但是当您觉得使用python更舒服时,就可以使用它。那么,是什么阻止了您这样做呢?也许您可以手动将旧集合中的数据替换为新集合?有必要使用脚本吗?问题是;有没有可能把{“老师”{姓名:“露西”,身份证:3,课程:“历史”},{姓名:“马克”,身份证:6,课程:“数学”},{姓名:“琼”,身份证:20,课程:“法语”}变成{姓名:“露西”,身份证:3,课程:“历史”},{姓名:“马克”,身份证:6,课程:“数学”},{姓名:“琼”,身份证:20,课程:“法语”}我不明白。“可能”是什么意思?用python?使用mongodb控制台还是其他方式?我希望使用python来完成这项工作,并将新文档保存到一个集合中。抱歉,我不是很清楚。编写python脚本来进行数据库转换将是一种有效的方法。您也可以使用MongoShell,因为它是一个成熟的javascript解释器,但是当您觉得使用python更舒服时,就可以使用它。那么,是什么阻止了您这样做呢?也许您可以手动将旧集合中的数据替换为新集合?有必要使用脚本吗?非常感谢!是否可以使最终的_id与原始集合中的id相同?我认为这不是一个好主意(如果使用默认的ObjectId)。但这是可能的。非常感谢!是否可以使最终的_id与原始集合中的id相同?我认为这不是一个好主意(如果使用默认的ObjectId)。但这是可能的。
db.school.aggregate(
  {$match: { 'teachers.id' : 3 }}, 
  {$unwind : '$teachers'}, 
  {$project: { 
    _id: 0, 
    name: '$teachers.name',
    id: '$teachers.id', 
    course: '$teachers.course' 
  }}, 
  {$match: {id:3}}
);