Tôi sẽ không lưu trữ kết quả dưới dạng tài liệu nhúng trong form
tài liệu, vì bạn có thể không biết tiên nghiệm có bao nhiêu bài nộp để mong đợi. MongoDB giới hạn mỗi tài liệu là 16MB, nhưng trong thực tế, bạn có thể muốn duy trì tốt dưới ngưỡng này.
Vì các biểu mẫu của bạn có thể thay đổi, nhưng được xác định trước (nghĩa là mỗi biểu mẫu có thể khác nhau nhưng các biểu mẫu được xác định trước trong một số loại giao diện người dùng quản trị), tôi khuyên bạn nên sử dụng hai bộ sưu tập:
Đầu tiên (gọi nó là form
) sẽ lưu trữ dữ liệu về cấu trúc của từng biểu mẫu:trường nào, loại nào, thứ tự như thế nào, v.v. Bạn có thể tưởng tượng các tài liệu trong bộ sưu tập này sẽ trông giống như sau:
{ _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 },
}
]
}
Điều này cho phép bạn xây dựng các biểu mẫu động (cùng với một số mã phía máy chủ) khi cần thiết để hiển thị trong ứng dụng của bạn. Nó cũng cung cấp thông tin về các trường là gì và xác thực nào là cần thiết cho chúng, bạn có thể sử dụng thông tin này trong quá trình gửi biểu mẫu. Bạn sẽ cần một chỉ mục trên URL hoặc bất kỳ trường nào bạn sử dụng để xác định biểu mẫu nào sẽ hiển thị khi phục vụ các yêu cầu web.
Bộ sưu tập thứ hai, submissions
hoặc cái gì đó, sẽ lưu trữ dữ liệu đã gửi cho mỗi biểu mẫu. Các tài liệu sẽ giống như sau:
{ _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
}
}
Nếu bạn cần có thể tìm kiếm theo các cặp trường-giá trị (hoặc chỉ giá trị) trong các biểu mẫu đã gửi, thì biến thể này sử dụng một mảng cho các giá trị values
trường, như:
{ ...
values: [
{ name: "username", value: "dcrosta" },
{ name: "email", value: "[email protected]" }
]
}
Sau đó, bạn có thể tạo chỉ mục trên các giá trị values
và tìm kiếm như:
// find "dcrosta" as username
db.submissions.find({values: {$elemMatch: {name: "username", value: "dcrosta"}}})
Hoặc tạo chỉ mục trên "giá trị.value" và tìm kiếm như:
// find "dcrosta" as value to any field
db.submissions.find({"values.value": "dcrosta"})