web-dev-qa-db-fra.com

Pouvez-vous spécifier une clé pour $ addToSet dans Mongo?

J'ai un document:

{ 'profile_set' :
  [
    { 'name' : 'nick', 'options' : 0 },
    { 'name' : 'joe',  'options' : 2 },
    { 'name' : 'burt', 'options' : 1 }
  ] 
}

et souhaite ajouter un nouveau document à l'ensemble profile_set si le nom n'existe pas déjà (quelle que soit l'option).

Donc, dans cet exemple, si j'ai essayé d'ajouter:

{'name' : 'matt', 'options' : 0}

il faut l'ajouter, mais en ajoutant

{'name' : 'nick', 'options' : 2}

ne devrait rien faire car un document existe déjà avec le nom nick même si le option est différent.

Mongo semble correspondre à l'ensemble de l'élément et je me retrouve avec pour vérifier si c'est la même chose et je me retrouve avec

profile_set containing [{'name' : 'nick', 'options' : 0}, {'name' : 'nick', 'options' : 2}]

Existe-t-il un moyen de le faire avec $ addToSet ou dois-je pousser une autre commande?

64
nickponline

Vous pouvez qualifier votre update avec un objet de requête qui empêche la mise à jour si le name est déjà présent dans profile_set. Dans le Shell:

db.coll.update(
    {_id: id, 'profile_set.name': {$ne: 'nick'}}, 
    {$Push: {profile_set: {'name': 'nick', 'options': 2}}})

Donc, cela ne fera que le $Push pour un document avec une correspondance _id et où il n'y a pas de profile_set élément où name est 'nick'.

85
JohnnyHK