2012-11-20 209 views
0
{ 
"teachers" : [ 
       {"name": "Lucy", "id": 3, course: "history"}, 
       {"name": "Mark", "id": 6, "course": "maths"}, 
       {"name": "Joan", "id": 20, course: "French"} 
       ] 
} 

本文檔位於「學校」集合中。我一直在嘗試使用Mongo DB:如何將一組文檔轉換爲單個文檔?

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

訪問這些文件嵌入我也試過

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

,但我的理解是,因爲蒙戈不工作不能看的嵌入式陣列內。 因此,我想將這些嵌入式文檔變成單個文檔。也就是說,刪除嵌入和「教師」鍵,爲每位教師創建一個單獨的文檔。

最後的「學校」的收集將

{"name": "Lucy", "id": 3, "course": "history"}, 
{"name": "Mark", "id": 6, "course": "maths"}, 
{"name": "Joan", "id": 20, "course": "French"} 

我想使用Python這樣做,並保存新文檔到一個集合。

編輯

這就是我想出現在:

import pymongo 
import sys 

connection = pymongo.Connection("mongodb://localhost", safe=True) 

db = connection.hello 
shows = db.school 

for doc in db.school: 
    for indiv in "teachers": 
      try: 
      db.individual.insert(indiv) 
     except: 
      print "Unexpected error", sys.exc_info()[0] 
+1

所以,問題是...... – alexvassel

+0

問題是;是否有可能變爲 {「teachers」:[{name:「Lucy」,id:3,course:「history」}, {name:「Mark」,id:6,course:「maths」}, {名: 「瓊」,編號:20,課程: 「法國」}]} 到 {名: 「露西」,ID:3,課程: 「歷史」}, {名:「馬克「,id:6,course:」maths「}, {name:」Joan「,id:20,course:」French「} – Julia

+0

我不明白。你是什​​麼意思'可能'?用python?用mongodb控制檯還是隻是無論如何? – alexvassel

回答

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

這個怎麼樣?

+0

非常感謝!是否有可能使最終的_id與原始集合中的id相同? – Julia

+0

我不認爲這是一個好主意(如果你使用默認的ObjectId)。但這是可能的。 – alexvassel

1

您可以從蒙戈V2.2 +使用aggregate命令(它是在pymongo):

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})}) 
+0

巧妙的把戲!但是有一個錯誤的fagg/sagg。 – Eric

+0

錯誤已更正。 – 42n4

1

順便說一句,MongoDB的可以發現,在陣列嵌入文檔:

db.school.find({ 'teachers.id' : 3 }); 

您可以在mongodb documentation瞭解更多關於點符號的信息。

如果我們的目標是隻返回嵌入文檔,你可以使用一個aggregate要求:

db.school.aggregate(
    {$match: { 'teachers.id' : 3 }}, 
    {$unwind : '$teachers'}, 
    {$project: { 
    _id: 0, 
    name: '$teachers.name', 
    id: '$teachers.id', 
    course: '$teachers.course' 
    }}, 
    {$match: {id:3}} 
); 
相關問題