Jeg ville ikke gemme resultater som indlejrede dokumenter i form
dokument, da du måske ikke kender a priori hvor mange indlæg man kan forvente. MongoDB begrænser hvert dokument til 16 MB, men i praksis vil du sandsynligvis holde dig et godt stykke under denne tærskel.
Da dine formularer er variable, men forudbestemte (det vil sige, at hver formular kan variere, men formularerne er defineret på forhånd i en form for administrationsbrugergrænseflade), vil jeg anbefale at bruge to samlinger:
Den første (kald den forms
). ) vil gemme data om sammensætningen af hver formular:hvilke felter, hvilke typer, i hvilken rækkefølge osv. Du kunne forestille dig, at dokumenter i denne samling ville se sådan ud:
{ _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 },
}
]
}
Dette lader dig konstruere formularerne dynamisk (sammen med noget server-side-kode) efter behov for visning i din applikation. Det giver også information om, hvad felterne er, og hvilken validering der kræves for dem, som du kan bruge under indsendelse af formularen. Du vil have et indeks over URL-adresser eller et hvilket som helst felt, du bruger til at bestemme, hvilken formular der skal vises, når du sender webanmodninger.
Den anden samling, submissions
eller noget, ville gemme de indsendte data for hver formular. Dokumenter vil se sådan ud:
{ _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
}
}
Hvis du har brug for at kunne søge efter felt-værdi-par (eller bare værdier) i de indsendte formularer, bruger en variation af dette et array for values
felt, som:
{ ...
values: [
{ name: "username", value: "dcrosta" },
{ name: "email", value: "[email protected]" }
]
}
Du kan derefter oprette et indeks på values
felt, og søg som:
// find "dcrosta" as username
db.submissions.find({values: {$elemMatch: {name: "username", value: "dcrosta"}}})
Eller opret et indeks på "values.value" og søg som:
// find "dcrosta" as value to any field
db.submissions.find({"values.value": "dcrosta"})