2011-03-21 14 views
5

¿Puede alguien señalarme en la dirección correcta, tengo una colección (formularios) cada formulario tiene una matriz de documentos incrustados (respuestas). Las respuestas para cada formulario se han vuelto masivas y, en retrospectiva, incorporarlas fue una mala idea (los documentos mongo, incluidos los integrados, tienen un límite de tamaño máximo).Mover el documento embargado de Mongo en la propia colección

¿Hay alguna manera de mover rápida y fácilmente todas estas respuestas incrustadas en su propia colección? ¿Hay algo así como la selección de SQL anterior en? He echado un vistazo en la consola de rails, pero es inaccesible con tantos documentos incrustados, así que supongo que tendrá que ser una consulta compleja de búsqueda e inserción en la consola de mongo. (simplemente adivinando)

Mi modelo está arreglado pero esta migración (y los documentos de mongo) me están abrumando.

TIA Dougle

Respuesta

4

Así que aquí es un comienzo ... Esta se encuentra en la consola mongo

db.questions.insert({name:"jwo", responses:[{question:"your name?", answer:"yomamma"}, {question:"your name?", answer:"pappa"}]}); 

Esto creó una estructura JSON documento, así:

> db.questions.findOne(); 
{ 
    "_id" : ObjectId("4d877e89b75dc42c4709278d"), 
    "name" : "jwo", 
    "responses" : [ 
     { 
      "question" : "your name?", 
      "answer" : "yomamma" 
     }, 
     { 
      "question" : "your name?", 
      "answer" : "pappa" 
     } 
    ] 
} 

Ahora bucle a través las respuestas, y establecer su question_id con las preguntas '_id, y luego insertarlo en la nueva colección de respuestas

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

Deseará cambiar el db.questions.findOne para buscarlos todos y repetirlos. Si esto tarda un tiempo, es posible que deba cambiar a una función de reducción de mapa.

+0

Esto funcionó un placer gracias, tienes razón, tardó un tiempo: oD –

1

Aquí está el código que terminamos, basado en la respuesta de 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]); 
    } 
}); 
Cuestiones relacionadas