2011-03-21 81 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]); 
    } 
}); 
相关问题