Je ne stockerais pas les résultats sous forme de documents intégrés dans le form
document, puisque vous ne savez peut-être pas a priori combien de soumissions attendre. MongoDB limite chaque document à 16 Mo, mais en pratique, vous souhaitez probablement rester bien en dessous de ce seuil.
Étant donné que vos formulaires sont variables, mais prédéterminés (c'est-à-dire que chaque formulaire peut différer, mais les formulaires sont définis à l'avance dans une sorte d'interface utilisateur d'administration), je vous recommande d'utiliser deux collections :
Le premier (appelez-le forms
) stockera des données sur la composition de chaque formulaire :quels champs, quels types, dans quel ordre, etc. Vous pouvez imaginer que les documents de cette collection ressembleraient à ceci :
{ _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 },
}
]
}
Cela vous permet de construire dynamiquement les formulaires (avec du code côté serveur) selon les besoins pour les afficher dans votre application. Il donne également des informations sur les champs et la validation requise pour eux, que vous pouvez utiliser lors de la soumission du formulaire. Vous voudrez un index sur l'URL ou tout autre champ que vous utilisez pour déterminer le formulaire à afficher lors du traitement des requêtes Web.
La deuxième collection, submissions
ou quelque chose, stockerait les données soumises pour chaque formulaire. Les documents ressembleraient à :
{ _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
}
}
Si vous devez être en mesure de rechercher par paires champ-valeur (ou simplement par valeurs) dans les formulaires soumis, une variante utilise un tableau pour les values
champ, comme :
{ ...
values: [
{ name: "username", value: "dcrosta" },
{ name: "email", value: "[email protected]" }
]
}
Vous pouvez alors créer un index sur les values
champ, et recherchez comme :
// find "dcrosta" as username
db.submissions.find({values: {$elemMatch: {name: "username", value: "dcrosta"}}})
Ou créez un index sur "values.value" et recherchez comme :
// find "dcrosta" as value to any field
db.submissions.find({"values.value": "dcrosta"})