Не бих съхранявал резултатите като вградени документи във form
документ, тъй като може да не знаете a priori колко подавания да очаквате. MongoDB ограничава всеки документ до 16MB, но на практика вероятно ще искате да останете доста под този праг.
Тъй като вашите формуляри са променливи, но предварително определени (тоест всеки формуляр може да се различава, но формулярите се дефинират предварително в някакъв вид администраторски потребителски интерфейс), бих препоръчал да използвате две колекции:
Първият (наречете го forms
) ще съхранява данни за състава на всеки формуляр:какви полета, какви типове, в какъв ред и т.н. Можете да си представите, че документите в тази колекция ще изглеждат по следния начин:
{ _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 },
}
]
}
Това ви позволява да конструирате формулярите динамично (заедно с някакъв код от страна на сървъра), както е необходимо за показване във вашето приложение. Той също така дава информация за това какви са полетата и каква проверка се изисква за тях, която можете да използвате по време на подаване на формуляр. Ще искате индекс на URL адрес или каквото и да е поле, което използвате, за да определите кой формуляр да се показва при обслужване на уеб заявки.
Втората колекция, submissions
или нещо подобно, ще съхранява изпратените данни за всеки формуляр. Документите ще изглеждат така:
{ _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
}
}
Ако трябва да можете да търсите по двойки поле-стойност (или просто стойности) в изпратените формуляри, вариант на това използва масив за values
поле, като:
{ ...
values: [
{ name: "username", value: "dcrosta" },
{ name: "email", value: "[email protected]" }
]
}
След това можете да създадете индекс за values
поле и търсете като:
// find "dcrosta" as username
db.submissions.find({values: {$elemMatch: {name: "username", value: "dcrosta"}}})
Или създайте индекс на „values.value“ и търсете като:
// find "dcrosta" as value to any field
db.submissions.find({"values.value": "dcrosta"})