Non memorizzerei i risultati come documenti incorporati all'interno del form
documento, poiché potresti non conoscerlo a priori quanti invii aspettarsi. MongoDB limita ogni documento a 16 MB, ma in pratica probabilmente vorrai rimanere ben al di sotto di questa soglia.
Poiché i tuoi moduli sono variabili, ma predeterminati (ovvero, ogni modulo può differire ma i moduli sono definiti in anticipo in una sorta di interfaccia utente di amministrazione), ti consiglio di utilizzare due raccolte:
Il primo (chiamalo forms
) memorizzerà i dati sulla composizione di ogni modulo:quali campi, quali tipi, in quale ordine, ecc. Puoi immaginare che i documenti in questa raccolta assomiglierebbero a questo:
{ _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 },
}
]
}
Ciò ti consente di costruire i moduli in modo dinamico (insieme a del codice lato server) secondo necessità per la visualizzazione nell'applicazione. Fornisce inoltre informazioni su quali sono i campi e quale convalida è richiesta per essi, che puoi utilizzare durante l'invio del modulo. Avrai bisogno di un indice sull'URL o su qualsiasi campo che utilizzi per determinare quale modulo visualizzare quando servi le richieste web.
La seconda raccolta, submissions
o qualcosa del genere, memorizzerebbe i dati inviati per ogni modulo. I documenti sarebbero simili a:
{ _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 devi essere in grado di cercare per coppie campo-valore (o solo valori) nei moduli inviati, una variazione su questo utilizza un array per i values
campo, come:
{ ...
values: [
{ name: "username", value: "dcrosta" },
{ name: "email", value: "[email protected]" }
]
}
Puoi quindi creare un indice sui values
campo e cerca come:
// find "dcrosta" as username
db.submissions.find({values: {$elemMatch: {name: "username", value: "dcrosta"}}})
Oppure crea un indice su "values.value" e cerca come:
// find "dcrosta" as value to any field
db.submissions.find({"values.value": "dcrosta"})