tl; डॉ
हां, nullअद्वितीय "वास्तविक" मानों को लागू करते हुए, एक फ़ील्ड सेट के साथ कई दस्तावेज़ों को परिभाषित या परिभाषित नहीं किया जाना संभव है ।
आवश्यकताएँ :
- MongoDB v3.2 +।
- अपने ठोस मूल्य प्रकारों को पहले से जानना (जैसे, हमेशा
stringया objectजब नहीं null)।
यदि आप विवरणों में रुचि नहीं रखते हैं, तो implementationअनुभाग पर जाने के लिए स्वतंत्र महसूस करें ।
लंबा संस्करण
MongoDB v3.2 से शुरू होने वाले @ नोलन के उत्तर को पूरक करने के लिए, आप फ़िल्टर अभिव्यक्ति के साथ एक आंशिक अद्वितीय सूचकांक का उपयोग कर सकते हैं।
आंशिक फ़िल्टर अभिव्यक्ति की सीमाएँ हैं। इसमें केवल निम्नलिखित शामिल हो सकते हैं:
- समानता के भाव (अर्थात क्षेत्र: मूल्य या
$eqऑपरेटर का उपयोग करके ),
$exists: true अभिव्यक्ति,
$gt, $gte, $lt, $lteभाव,
$type भाव,
$and केवल शीर्ष स्तर पर ऑपरेटर
इसका मतलब है कि तुच्छ अभिव्यक्ति का {"yourField"{$ne: null}}उपयोग नहीं किया जा सकता है।
हालांकि, यह मानते हुए कि आपका क्षेत्र हमेशा एक ही प्रकार का उपयोग करता है , आप एक $typeअभिव्यक्ति का उपयोग कर सकते हैं ।
{ field: { $type: <BSON type number> | <String alias> } }
MongoDB v3.6 ने कई संभावित प्रकारों को निर्दिष्ट करने के लिए समर्थन जोड़ा, जिसे एक सरणी के रूप में पारित किया जा सकता है:
{ field: { $type: [ <BSON type1> , <BSON type2>, ... ] } }
जिसका अर्थ है कि यह मूल्य कई प्रकारों में से किसी एक के होने की अनुमति देता है जब नहीं null।
इसलिए, यदि हम emailनीचे दिए गए उदाहरण में फ़ील्ड को या तो स्वीकार करने की अनुमति देना चाहते हैं stringया कहें, binary dataमान, एक उपयुक्त $typeअभिव्यक्ति होगी:
{email: {$type: ["string", "binData"]}}
कार्यान्वयन
नेवला
आप इसे एक मानसून स्कीमा में निर्दिष्ट कर सकते हैं:
const UsersSchema = new Schema({
name: {type: String, trim: true, index: true, required: true},
email: {
type: String, trim: true, index: {
unique: true,
partialFilterExpression: {email: {$type: "string"}}
}
}
});
या सीधे इसे संग्रह में जोड़ें (जो मूल नोड का उपयोग करता है। जेएस चालक):
User.collection.createIndex("email", {
unique: true,
partialFilterExpression: {
"email": {
$type: "string"
}
}
});
देशी मोंगोडब ड्राइवर
का उपयोग करते हुए collection.createIndex
db.collection('users').createIndex({
"email": 1
}, {
unique: true,
partialFilterExpression: {
"email": {
$type: "string"
}
}
},
function (err, results) {
// ...
}
);
गेंदा का गोला
का उपयोग कर db.collection.createIndex:
db.users.createIndex({
"email": 1
}, {
unique: true,
partialFilterExpression: {
"email": {$type: "string"}
}
})
यह एक nullईमेल के साथ , या एक ईमेल क्षेत्र के बिना कई रिकॉर्ड डालने की अनुमति देगा , लेकिन एक ही ईमेल स्ट्रिंग के साथ नहीं।