Переместить встроенный документ Mongo в собственную коллекцию

Может ли кто-нибудь указать мне правильное направление, у меня есть коллекция (формы), каждая форма имеет встроенный массив документов (ответы). Ответы для каждой формы стали массовыми, и, оглядываясь назад, их встраивание было плохой идеей (документы mongo, включая встроенные, имеют максимальный размер).

Есть ли способ быстро и легко переместить все эти встроенные ответы в их собственную коллекцию? есть ли такая вещь, как старый выбор SQL? Я просмотрел консоль rails, но она недоступна с таким количеством встроенных документов, поэтому я полагаю, что это должен быть сложный запрос на поиск и вставку в консоли mongo? (просто угадал там)

Моя модель исправлена, но эта миграция (и документы mongo) ставят меня в тупик.

ТИА Дугл


person Question Mark    schedule 21.03.2011    source источник


Ответы (2)


Итак, начнем... Это в оболочке монго

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, чтобы найти их все и выполнить цикл. Если это займет некоторое время, вам может потребоваться переключиться на функцию уменьшения карты.

person Jesse Wolgamott    schedule 21.03.2011
comment
Это сработало, спасибо, вы правы, это заняло некоторое время :oD - person Question Mark; 24.03.2011

Вот код, который мы получили, основанный на ответе Джесси Уолгамотта.

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]);
  }
});
person Brian Armstrong    schedule 18.03.2013