83 votes

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 à la base de données profile_set si le nom n'existe pas déjà (quelle que soit l'option).

Ainsi, dans cet exemple, si j'essayais d'ajouter :

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

il devrait l'ajouter, mais l'ajout de

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

ne doit rien faire parce qu'il existe déjà un document portant le nom nick même si le option est différent.

Mongo semble faire une correspondance avec l'ensemble de l'élément et je finis par 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 appuyer sur une autre commande ?

108voto

JohnnyHK Points 61191

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

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

Ainsi, cette opération n'effectuera que l'opération $push pour un document avec une correspondance _id et lorsqu'il n'y a pas de profile_set élément où name es 'nick' .

12voto

Asya Kamsky Points 18076

Depuis MongoDB 4.2, il est possible de le faire en utilisant la fonction expressions d'agrégation dans la mise à jour .

Pour votre exemple, vous devez procéder de la manière suivante :

newSubDocs = [ {'name' : 'matt', 'options' : 0}, {'name' : 'nick', 'options' : 2} ];
db.coll.update( { _id:1 },
[ 
   {$set:  { profile_set:  {$concatArrays: [ 
      "$profile_set",  
      {$filter: {
             input:newSubDocs, 
             cond: {$not: {$in: [ "$$this.name", "$profile_set.name" ]}} 
      }}
   ]}}}
])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X