Mangouste: comment définir une combinaison de champs à être unique?
Si j'avais un schéma comme ceci:
var person = new Schema({
firstName: String,
lastName: String,
});
J'aimerais qu'il n'existe qu'un seul document avec le même firstName et lastName.
Comment puis-je y arriver?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez définir un unique composé d'index à l'aide d'un
index
appel sur votre schéma:Model.ensureIndexes([cb])
méthode qui "EnvoieensureIndex
commandes de mongo pour chaque indice a déclaré dans le schéma." Cela peut aider avec les questions de la réception de l'indice de bâton, mais j'ai lu que vous devez être prudent sur l'utilisation de l'ensureIndex
commande en productionModel.on('index', function(err) { console.log(err) });
person.index({firstName: 1, lastName: 1}, {name: 'unique_index_name', unique: true})
Amusant peu de chose, je ne récemment découvert par le biais de l'expérimentation avec la Mangouste. J'ai le schéma suivant par exemple:
L'idée était de créer un index composé unique sur
name
etuser
ensemble. De cette façon, un utilisateur peut créer autant de formes qu'ils le souhaitent, tant que chacun de leurs formes avaient un nom distinct. Et l'inverse était censé être vrai - formes pourraient avoir le même nom que longtemps qu'ils avaient de différents utilisateurs. Ça n'a pas marché comme ça pour moi.Ce que j'ai remarqué, c'est que, en dehors de l'index sur
_id
, trois autres entrées d'index ont été créés. Une de chaque pourname
,user
, etname_user
tous ensemble à être unique. J'ai fait une modification au schéma et inclusunique: false
à chacun des champs que j'utilisais pour le composé de l'indice et soudain, tout a fonctionné comme prévu. Ce que j'ai est:En regardant les indices qui ont été créés comme un résultat, je vois toujours les trois indices -
name
,user
, etname_user
. Mais la différence est que les deux premiers ne sont pas définies de façon à être unique où la dernière, le composé, est. Maintenant, mon cas d'utilisation de plusieurs formes distinctes par l'utilisateur, ou de même nom des formes avec différents utilisateurs fonctionne comme un champion.définir votre schéma comme ce
ou
Je n'ai pas essayé, mais à l'aide d'un index unique devrait faire l'affaire.
Vous pourriez avoir besoin pour vous débarrasser de tous les doublons dans la collection ou de le faire le plus rapidement et facilement :