Eu não armazenaria resultados como documentos incorporados no
form
documento, pois você pode não saber a priori quantas submissões esperar. O MongoDB limita cada documento a 16 MB, mas na prática você provavelmente quer ficar bem abaixo desse limite. Como seus formulários são variáveis, mas pré-determinados (ou seja, cada formulário pode ser diferente, mas os formulários são definidos antecipadamente em algum tipo de interface do usuário do administrador), recomendo usar duas coleções:
O primeiro (chame-o de
forms
) armazenará dados sobre a composição de cada formulário:quais campos, quais tipos, em que ordem, etc. Você poderia imaginar que os documentos nesta coleção seriam mais ou menos assim:{ _id: ObjectId(...),
name: "...",
// other fields, for permissions, URL, etc
fields: [
{ name: "username",
type: "text",
validation: { required: true, min: 1, max: null },
},
{ name: "email",
type: "text",
validation: { required: true, min: 5, max: null, email: true },
}
]
}
Isso permite que você construa os formulários dinamicamente (junto com algum código do lado do servidor) conforme necessário para exibição em seu aplicativo. Ele também fornece informações sobre quais são os campos e qual validação é necessária para eles, que você pode usar durante o envio do formulário. Você desejará um índice de URL ou qualquer campo que você use para determinar qual formulário exibir ao atender a solicitações da web.
A segunda coleção,
submissions
ou algo assim, armazenaria os dados enviados para cada formulário. Os documentos ficariam assim:{ _id: ObjectId(...),
form: ObjectId(...), // the ObjectId of the record in "forms"
// that this is a submission on
// other information here about the submitter:
// IP address, browser, date and time, etc
values: {
username: "dcrosta",
email: "[email protected]",
//any other fields here
}
}
Se você precisar pesquisar por pares de valor de campo (ou apenas valores) nos formulários enviados, uma variação disso usa uma matriz para os
values
campo, como:{ ...
values: [
{ name: "username", value: "dcrosta" },
{ name: "email", value: "[email protected]" }
]
}
Você pode então criar um índice nos
values
campo e pesquise como:// find "dcrosta" as username
db.submissions.find({values: {$elemMatch: {name: "username", value: "dcrosta"}}})
Ou crie um índice em "values.value" e pesquise como:
// find "dcrosta" as value to any field
db.submissions.find({"values.value": "dcrosta"})