Переместить вложенный документ Mongo в собственную коллекцию - PullRequest
5 голосов
/ 21 марта 2011

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

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

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

ТИА Dougle

Ответы [ 2 ]

5 голосов
/ 21 марта 2011

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

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

1 голос
/ 18 марта 2013

Вот код, который мы закончили, основываясь на ответе Джесси Волгамотта.

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]);
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...