【问题标题】:Move Mongo Embeded Document into Own Collection将 Mongodb 嵌入文档移动到自己的集合中
【发布时间】:2011-07-19 19:56:26
【问题描述】:

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

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

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

TIA 道尔

【问题讨论】:

    标签: ruby-on-rails ruby mongodb migration migrate


    【解决方案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]);
      }
    });
    

    【讨论】:

      【解决方案2】:

      所以这是一个开始...这是在 mongo shell 中

      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"
              }
          ]
      }
      

      现在循环遍历响应,并将其 question_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")
      }
      

      您需要更改 db.questions.findOne 以找到所有这些并循环。如果这确实需要一段时间,您可能需要切换到 map-reduce 函数。

      【讨论】:

      • 这很有效,谢谢,你说得对,确实需要一段时间:oD
      猜你喜欢
      • 2020-03-20
      • 1970-01-01
      • 2021-09-19
      • 2022-01-01
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      • 2016-09-22
      • 1970-01-01
      相关资源
      最近更新 更多