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
ईमेल के साथ , या एक ईमेल क्षेत्र के बिना कई रिकॉर्ड डालने की अनुमति देगा , लेकिन एक ही ईमेल स्ट्रिंग के साथ नहीं।