Partage
  • Partager sur Facebook
  • Partager sur Twitter

[MongoBD] Cas d'utilisation de upsert

Mise en place de concours

    21 novembre 2020 à 7:47:17

    Bonjour à tous,

    Je suis en train de tester la mis en place de concours et je cherche comment utiliser upsert dans le cas suivant.

    J'ai une collection concours avec 4 champs 'type', 'startDate', 'endDate', 'ranking'

    'ranking' étant le champ qui enregistre les résultats de chaque utilisateur sous la forme {idUser: x, duration: y}.

    Je créé donc un concours comme ça:

    db.concours.insert({type: 'activities', startDate: new Date('2020-11-01'), endDate: new Date('2020-12-01'), ranking: []})

    Et lorsqu'un utilisateur réalise une action, je veux mettre à jour la valeur 'duration' correspondant à l'idUser et si il n'est pas encore dans 'ranking', je l'insert. J'arrive donc à:

    db.concours.updateMany({startDate: {$lte: new Date()}, endDate: {$gte: new Date()}, ranking: {$elemMatch: {idUser: 1}}}, {$inc: ??????}, {upsert: true})

    J'utilise updateMany() car il peut y avoir plusieurs concours en même temps. Toujours est-il que je ne sais pas ce que je dois utiliser pour mettre à jour la valeur 'duration' de ll'élément. Pouvez-vous me donner des pistes ?

    EDIT:

    Je pense être sur quelque chose:

    db.concours.updateMany({startDate: {$lte: new Date()}, endDate: {$gte: new Date()}}, {$inc: {"ranking.$[element].duration": 60}}, {arrayFilters: [{"element.idUser": 1}], upsert:true})

    Ca met bien à jour si l'entrée existe mais ça n'insert pas si elle n'existe pas.

    EDIT 2:

    J'ai trouvé une solution en exécutant 2 requête mais je me demande si il n'y a pas moyen de le faire en une seule:

    db.concours.updateMany({startDate: {$lte: new Date()}, endDate: {$gte: new Date()}, ranking: {$elemMatch: {idUser: 1}}}, {$inc: {"ranking.$[elem].duration": 10}}, {arrayFilters: [{"elem.idUser": 1}]})
    db.concours.updateMany({startDate: {$lte: new Date()}, endDate: {$gte: new Date()}, ranking: {$not: {$elemMatch: {idUser: 1}}}}, {$push: {ranking: {idUser: 1, duration:10}}})

    Merci d'avance :D



    -
    Edité par tonin2310 21 novembre 2020 à 10:59:53

    • Partager sur Facebook
    • Partager sur Twitter
      21 novembre 2020 à 17:53:27

      Bonjour,

      Je ne connais pas vraiment MongoDB, mais il semble qu'il existe un upsert :

      https://docs.mongodb.com/manual/reference/method/Bulk.find.upsert/

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

      [MongoBD] Cas d'utilisation de upsert

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown