тл; д-р
Так, можливо мати декілька документів із полем, встановленим null
або не визначеним, при цьому застосовувати унікальні "фактичні" значення.
вимоги :
- MongoDB v3.2 +.
- Заздалегідь знаючи свої конкретні типи значень (наприклад, завжди a
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"}}
}
}
});
або безпосередньо додати його до колекції (для якої використовується нативний драйвер node.js):
User.collection.createIndex("email", {
unique: true,
partialFilterExpression: {
"email": {
$type: "string"
}
}
});
рідний водій mongodb
використовуючи collection.createIndex
db.collection('users').createIndex({
"email": 1
}, {
unique: true,
partialFilterExpression: {
"email": {
$type: "string"
}
}
},
function (err, results) {
// ...
}
);
шкаралупа mongodb
використовуючи db.collection.createIndex
:
db.users.createIndex({
"email": 1
}, {
unique: true,
partialFilterExpression: {
"email": {$type: "string"}
}
})
Це дозволить вставляти кілька записів null
електронною поштою або взагалі без поля електронної пошти, але не з однаковою рядком електронної пошти.