Ik zou de resultaten niet opslaan als ingesloten documenten in het form
document, aangezien u het misschien niet a priori . weet hoeveel inzendingen u kunt verwachten. MongoDB beperkt elk document tot 16 MB, maar in de praktijk wil je waarschijnlijk ruim onder deze drempel blijven.
Aangezien uw formulieren variabel zijn, maar vooraf bepaald (dat wil zeggen, elk formulier kan verschillen, maar de formulieren worden van tevoren gedefinieerd in een soort beheerdersinterface), raad ik aan om twee verzamelingen te gebruiken:
De eerste (noem het forms
) slaat gegevens op over de samenstelling van elk formulier:welke velden, welke typen, in welke volgorde, enz. U kunt zich voorstellen dat documenten in deze verzameling er ongeveer zo uitzien:
{ _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 },
}
]
}
Hiermee kunt u de formulieren dynamisch construeren (samen met wat code aan de serverzijde) zoals nodig voor weergave in uw toepassing. Het geeft ook informatie over wat de velden zijn en welke validatie daarvoor nodig is, die u kunt gebruiken tijdens het indienen van het formulier. U wilt een index op de URL of welk veld u ook gebruikt om te bepalen welk formulier moet worden weergegeven bij het verwerken van webverzoeken.
De tweede verzameling, submissions
of zoiets, zou de ingediende gegevens voor elk formulier opslaan. Documenten zien er als volgt uit:
{ _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
}
}
Als u in de ingediende formulieren moet kunnen zoeken op veld-waardeparen (of alleen waarden) dan gebruikt een variatie hierop een array voor de values
veld, zoals:
{ ...
values: [
{ name: "username", value: "dcrosta" },
{ name: "email", value: "[email protected]" }
]
}
U kunt dan een index maken op de values
veld, en zoek zoals:
// find "dcrosta" as username
db.submissions.find({values: {$elemMatch: {name: "username", value: "dcrosta"}}})
Of maak een index op "values.value" en zoek als volgt:
// find "dcrosta" as value to any field
db.submissions.find({"values.value": "dcrosta"})