結果をform
内に埋め込みドキュメントとして保存しません 先験的を知らない可能性があるため、ドキュメント 予想される提出の数。 MongoDBでは各ドキュメントが16MBに制限されていますが、実際には、このしきい値を大幅に下回るようにする必要があります。
フォームは可変ですが、事前に決定されているため(つまり、各フォームは異なる場合がありますが、フォームはある種の管理UIで事前に定義されています)、2つのコレクションを使用することをお勧めします。
最初の(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 },
}
]
}
これにより、アプリケーションでの表示に必要なフォームを動的に(サーバー側のコードとともに)作成できます。また、フィールドとは何か、およびフィールドに必要な検証に関する情報も提供します。これは、フォームの送信時に使用できます。 Webリクエストを処理するときに表示するフォームを決定するために使用するURLまたは任意のフィールドのインデックスが必要になります。
2番目のコレクションである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"})