5

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

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

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

TIA 道尔

4

2 回答 2

5

所以这是一个开始......这是在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"
        }
    ]
}

现在遍历响应,并使用问题的 _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 以找到所有这些并循环。如果这确实需要一段时间,您可能需要切换到 map-reduce 功能。

于 2011-03-21T16:48:32.673 回答
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]);
  }
});
于 2013-03-18T09:41:14.473 回答