5

誰かが私を正しい方向に向けることができますか?私はコレクション(フォーム)を持っています。各フォームにはドキュメント配列(応答)が埋め込まれています。各フォームの応答は膨大になり、後から考えると、それらを埋め込むことは悪い考えでした(埋め込みを含むmongoドキュメントには最大サイズ制限があります)。

これらの埋め込まれたすべての応答を独自のコレクションにすばやく簡単に移動する方法はありますか?古いSQLselectintoのようなものはありますか?Railsコンソールを見て回ったことがありますが、非常に多くの埋め込みドキュメントではアクセスできないため、mongoコンソールでの複雑な検索と挿入のクエリである必要があると思いますか?(そこを推測するだけです)

私のモデルは修正されていますが、この移行(およびmongoドキュメント)は私を困惑させています。

TIAダグル

4

2 に答える 2

5

だからここから始めましょう...これは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"
        }
    ]
}

次に、回答をループし、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機能に切り替える必要があるかもしれません。

于 2011-03-21T16:48:32.673 に答える
1

これが、JesseWolgamottの回答に基づいた最終的なコードです。

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 に答える