2011-03-21 40 views
5

有人可以指向我正確的方向,我有一個Collection(Forms)每個Form都有一個嵌入式文檔數組(Responses)。每個表格的回覆都變得非常龐大,回想起來嵌入它們是一個糟糕的主意(包括嵌入的mongo文檔具有最大大小限制)。將Mongo嵌入式文檔轉移到自己的收藏

有沒有一種方法可以快速輕鬆地將所有這些嵌入式響應轉移到自己的集合中?有沒有像舊的SQL選入的東西?我在Rails控制檯中查看過,但是如此多的嵌入式文檔無法訪問,所以我想它必須是一個複雜的查找並在mongo控制檯中插入查詢? (只是猜測那裏)

我的模型是固定的,但這種遷移(和mongo文檔)困擾着我。

TIA Dougle

回答

4

所以這裏是一個開始......這是蒙戈外殼

db.questions.insert({name:"jwo", responses:[{question:"your name?", answer:"yomamma"}, {question:"your name?", answer:"pappa"}]}); 

此創建的文檔JSON結構,像這樣:現在

> db.questions.findOne(); 
{ 
    "_id" : ObjectId("4d877e89b75dc42c4709278d"), 
    "name" : "jwo", 
    "responses" : [ 
     { 
      "question" : "your name?", 
      "answer" : "yomamma" 
     }, 
     { 
      "question" : "your name?", 
      "answer" : "pappa" 
     } 
    ] 
} 

環通回答,並用問題的_id設置他們的question_id,然後將其插入新的回覆集合

> for(i=0; i<question.responses.length; ++i){ 
... question.responses[i].question_id = question._id; 
... db.responses.insert(question.responses[i]);                  
... } 

> db.responses.findOne(); 
{ 
    "_id" : ObjectId("4d878059b75dc42c4709278e"), 
    "question" : "your name?", 
    "answer" : "yomamma", 
    "question_id" : ObjectId("4d877e89b75dc42c4709278d") 
} 

你會想改變db.questions.findOne來找到它們並循環。如果這確實需要一段時間,您可能需要切換到地圖縮小功能。

+0

這工作很好,謝謝,你說得對,它需要一段時間:oD – 2011-03-24 14:53:56

1

這是我們結束的代碼,基於Jesse Wolgamott的回答。

var count = 0; 
db.transactions.find().sort({_id: 1}).forEach(function(t){ 
    if(count % 10000 == 0) 
    print(""+t._id+" "+count); 

    count += 1; 

    for(i=0; i<t.inputs.length; ++i){ 
    t.inputs[i].transaction_id = t._id; 
    db.input2s.insert(t.inputs[i]); 
    } 
}); 
相關問題