tl; dr
Evet, null
benzersiz "gerçek" değerleri zorunlu kılarken, alanı tanımlanmış veya tanımlanmamış birden çok belgeye sahip olmak mümkündür .
gereksinimleri :
- MongoDB v3.2 +.
- Önceden somut değer türlerinizi bilmek (örneğin, her zaman a
string
veya object
ne zaman null
).
Ayrıntılarla ilgilenmiyorsanız, implementation
bölüme geçmekten çekinmeyin .
daha uzun versiyon
@ Nolan'ın cevabını tamamlamak için, MongoDB v3.2'den başlayarak, bir filtre ifadesiyle kısmi benzersiz bir dizin kullanabilirsiniz.
Kısmi filtre ifadesinin sınırlamaları vardır. Yalnızca aşağıdakileri içerebilir:
- eşitlik ifadeleri (yani alan: değer veya
$eq
operatörü kullanma ),
$exists: true
ifade
$gt
, $gte
, $lt
, $lte
İfadeler,
$type
ifade,
$and
yalnızca üst düzeydeki operatör
Bu, önemsiz ifadenin {"yourField"{$ne: null}}
kullanılamayacağı .
Bununla birlikte, alanınızın her zaman aynı türü kullandığını varsayarsak, bir $type
ifade kullanabilirsiniz .
{ field: { $type: <BSON type number> | <String alias> } }
MongoDB v3.6, dizi olarak geçirilebilen birden çok olası türü belirtmek için destek ekledi:
{ field: { $type: [ <BSON type1> , <BSON type2>, ... ] } }
bu, değerin, olmadığında birden çok türden herhangi birinde olmasına izin verdiği anlamına gelir null
.
Bu nedenle, email
aşağıdaki örnekteki alanın değerlerden birini string
veya örneğin binary data
değerleri kabul etmesine izin vermek istiyorsak , uygun bir $type
ifade şöyle olacaktır:
{email: {$type: ["string", "binData"]}}
uygulama
firavun faresi
Bunu bir firavun faresi şemasında belirtebilirsiniz:
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"}}
}
}
});
veya doğrudan koleksiyona ekleyin (yerel node.js sürücüsünü kullanır):
User.collection.createIndex("email", {
unique: true,
partialFilterExpression: {
"email": {
$type: "string"
}
}
});
yerli mongodb sürücüsü
kullanma collection.createIndex
db.collection('users').createIndex({
"email": 1
}, {
unique: true,
partialFilterExpression: {
"email": {
$type: "string"
}
}
},
function (err, results) {
// ...
}
);
mongodb kabuğu
kullanma db.collection.createIndex
:
db.users.createIndex({
"email": 1
}, {
unique: true,
partialFilterExpression: {
"email": {$type: "string"}
}
})
Bu, bir null
e-posta ile veya hiç bir e-posta alanı olmadan, ancak aynı e-posta dizesiyle birden çok kayıt eklemeye izin verecektir .