mongoDB/mangouste: unique si non null
Je me demandais si il y a moyen de forcer une collection unique d'entrée mais seulement si l'entrée n'est pas null.
e
Exemple de schéma:
var UsersSchema = new Schema({
name : {type: String, trim: true, index: true, required: true},
email : {type: String, trim: true, index: true, unique: true}
});
"e-mail" dans ce cas n'est pas nécessaire mais si "e-mail" est enregistré je veux faire en sorte que cette entrée est unique (à un niveau de base de données).
Entrées vides semblent obtenir la valeur 'null', de sorte que chaque entrée avec pas de mail se bloque avec le 'unique' option (si il y a un autre utilisateur avec pas de courriel).
Je suis en train de le résoudre au niveau de l'application, mais aimerais enregistrer que db requête.
thx
Vous devez vous connecter pour publier un commentaire.
De MongoDB v1.8+, vous pouvez obtenir le comportement désiré de s'assurer de valeurs uniques, mais permettant à plusieurs docs sans le terrain par la mise en au
sparse
option à true lors de la définition de l'index. Comme dans:Ou dans le shell:
Noter qu'un unique, rare indice ne permet pas encore de plusieurs docs avec un
email
champ avec un valeur denull
, seulement plusieurs docs sans unemail
champ.Voir http://docs.mongodb.org/manual/core/index-sparse/
email
champ, pas là où il est réellement, il y a une valeur denull
. Voir mise à jour de réponse.sparse: true
. Ajoutez-le et il fonctionne très bien. Peut-être mieux de poster une nouvelle question avec ce que vous voyez.tl;dr
Oui, il est possible d'avoir plusieurs documents avec un champ
null
ou non défini, tout en appliquant unique "réelle" des valeurs.exigences:
string
ouobject
lorsqu'il n'est pasnull
).Si vous n'êtes pas intéressé par les détails, n'hésitez pas à passer à la
implementation
section.version longue
Pour compléter @Nolan réponse, en commençant avec MongoDB v3.2 vous pouvez utiliser partielle d'un index unique avec une expression de filtre.
Le filtre partiel d'expression a des limites. Il ne peut inclure les éléments suivants:
Cela signifie que l'expression triviale
{"yourField"{$ne: null}}
ne peut pas être utilisé.Cependant, en supposant que votre champ utilise toujours le même type de, vous pouvez utiliser un
$type
expression.MongoDB v3.6 ajout du support pour la spécification de plusieurs types possibles, qui peuvent être transmis dans un tableau:
ce qui signifie qu'il permet à la valeur d'un nombre quelconque de plusieurs types, lorsqu'il n'est pas
null
.Par conséquent, si nous voulons permettre à la
email
champ dans l'exemple ci-dessous pour accepter lestring
ou, disons,binary data
valeurs, un$type
expression serait:mise en œuvre
mangouste
Vous pouvez le préciser dans une mangouste schéma:
ou directement ajouter à la collection (qui utilise le natif node.js pilote):
natif mongodb pilote
à l'aide de
de la collection.createIndex
mongodb shell
à l'aide de
db.collection.createIndex
:Cela permettra d'insérer plusieurs enregistrements avec un
null
e-mail, ou sans un champ e-mail à tout, mais pas avec la même adresse email de la chaîne.unique
etsparse
). J'ai mis à jour mon schéma avec cette réponse, a chuté de mon index existant, et cela a fonctionné comme un charme.Juste une mise à jour rapide pour ceux à la recherche de cette rubrique.
La réponse sélectionnée va fonctionner, mais vous pouvez envisager d'utiliser partielle des indices de la place.
Plus doco partielle d'indices: https://docs.mongodb.com/manual/core/index-partial/
En fait, seul le premier document où "e-mail" comme champ n'existe pas va se sauver avec succès. Les sauvegardes suivantes, où "e-mail" n'est pas présent échouera tout en donnant de l'erreur ( voir l'extrait de code ci-dessous). Pour la raison regarder MongoDB la documentation officielle concernant les Index Uniques et des Touches Manquantes ici à http://www.mongodb.org/display/DOCS/Indexes#Indexes-UniqueIndexes.
Par définition unique d'index ne peut permettre à une valeur stockée qu'une seule fois. Si vous considérez la valeur null comme l'une de ces valeurs, il ne peut être inséré une fois! Vous avez raison dans votre démarche en s'assurant et en la validant au niveau de l'application. C'est la façon dont il peut être fait.
Vous pouvez aussi lire ce http://www.mongodb.org/display/DOCS/Querying+et+les valeurs null