Výsledky bych neukládal jako vložené dokumenty do form
dokument, protože možná neznáte a priori kolik příspěvků lze očekávat. MongoDB omezuje každý dokument na 16 MB, ale v praxi pravděpodobně budete chtít zůstat hluboko pod touto hranicí.
Vzhledem k tomu, že vaše formuláře jsou variabilní, ale předem určené (to znamená, že každý formulář se může lišit, ale formuláře jsou předem definovány v nějakém druhu uživatelského rozhraní správce), doporučil bych použít dvě kolekce:
První (nazývejte jej forms
) bude ukládat data o složení každého formuláře:jaká pole, jaké typy, v jakém pořadí atd. Můžete si představit, že dokumenty v této kolekci budou vypadat nějak takto:
{ _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 },
}
]
}
To vám umožní vytvářet formuláře dynamicky (spolu s nějakým kódem na straně serveru) podle potřeby pro zobrazení ve vaší aplikaci. Poskytuje také informace o tom, co jsou pole a jaké ověření je pro ně vyžadováno, což můžete použít při odesílání formuláře. Budete chtít index na adrese URL nebo jiném poli, které používáte k určení formuláře, který se má zobrazit při poskytování webových požadavků.
Druhá kolekce, submissions
nebo tak něco, uloží odeslaná data pro každý formulář. Dokumenty budou vypadat takto:
{ _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
}
}
Pokud potřebujete mít možnost vyhledávat podle párů pole-hodnota (nebo jen hodnot) v odeslaných formulářích, varianta tohoto používá pole pro values
pole, jako:
{ ...
values: [
{ name: "username", value: "dcrosta" },
{ name: "email", value: "[email protected]" }
]
}
Poté můžete vytvořit index pro values
pole a hledejte jako:
// find "dcrosta" as username
db.submissions.find({values: {$elemMatch: {name: "username", value: "dcrosta"}}})
Nebo vytvořte index na "values.value" a hledejte jako:
// find "dcrosta" as value to any field
db.submissions.find({"values.value": "dcrosta"})