मैं परिणामों को form
. में एम्बेड किए गए दस्तावेज़ों के रूप में संग्रहीत नहीं करूंगा दस्तावेज़, क्योंकि आप प्राथमिकता . नहीं जानते होंगे कितने सबमिशन की उम्मीद है. MongoDB प्रत्येक दस्तावेज़ को 16MB तक सीमित करता है, लेकिन व्यवहार में आप शायद इस सीमा से काफी नीचे रहना चाहते हैं।
चूंकि आपके प्रपत्र परिवर्तनशील हैं, लेकिन पूर्व-निर्धारित (अर्थात, प्रत्येक प्रपत्र भिन्न हो सकते हैं लेकिन प्रपत्र किसी प्रकार के व्यवस्थापक UI में समय से पहले परिभाषित किए गए हैं), मैं दो संग्रहों का उपयोग करने की अनुशंसा करता हूं:
पहला (इसे 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"})