Ruby on rails 将Mongo嵌入的文档移动到自己的集合中

Ruby on rails 将Mongo嵌入的文档移动到自己的集合中,ruby-on-rails,ruby,mongodb,migration,migrate,Ruby On Rails,Ruby,Mongodb,Migration,Migrate,有人能给我指出正确的方向吗?我有一个集合(表单)每个表单都有一个嵌入式文档数组(响应)。每个表单的响应都非常大,事后看来,嵌入它们是个坏主意(包括嵌入在内的mongo文档有一个最大大小限制) 有没有一种方法可以让我快速轻松地将所有这些嵌入的响应移动到它们自己的集合中?有没有像旧的SQL select into这样的东西?我在rails控制台中查看了一下,但是有这么多嵌入文档无法访问它,所以我想在mongo控制台中必须进行复杂的查找和插入查询?(只是猜测而已) 我的模型是固定的,但是这个迁移(和m

有人能给我指出正确的方向吗?我有一个集合(表单)每个表单都有一个嵌入式文档数组(响应)。每个表单的响应都非常大,事后看来,嵌入它们是个坏主意(包括嵌入在内的mongo文档有一个最大大小限制)

有没有一种方法可以让我快速轻松地将所有这些嵌入的响应移动到它们自己的集合中?有没有像旧的SQL select into这样的东西?我在rails控制台中查看了一下,但是有这么多嵌入文档无法访问它,所以我想在mongo控制台中必须进行复杂的查找和插入查询?(只是猜测而已)

我的模型是固定的,但是这个迁移(和mongo文档)让我感到困惑

短暂性脑缺血发作
道格

这是一个开始。。。这是在蒙戈贝壳里

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设置问题的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")
}
(i=0;i db.responses.findOne(); { “_id”:ObjectId(“4d878059b75dc42c4709278e”), “问题”:“你叫什么名字?”, “回答”:“yomamma”, “问题id”:ObjectId(“4d877e89b75dc42c4709278d”) }
您需要更改db.questions.findOne以查找所有问题并进行循环。如果这需要一段时间,您可能需要切换到map reduce函数。

以下是我们根据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]);
  }
});
var计数=0;
db.transactions.find().sort({u id:1}).forEach(函数(t){
如果(计数%10000==0)
打印(“+t.\U id+”+计数);
计数+=1;

因为(i=0;我做了一个招待谢谢,你说得对,确实花了一段时间:oD