IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NoSQL Discussion :

Requête update sur MongoDB


Sujet :

NoSQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 57
    Points : 41
    Points
    41
    Par défaut Requête update sur MongoDB
    Bonjour,

    je souhaiterais lors d'une mise à jour de données, supprimer des attributs en fonction de leur date d'enregistrement à l'aide d'une seule et même requête mongo.

    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    db.food.update({"ad":"noc"},{$unset:{"list.p3.date":{$lt:Date()}}});
    Dans l'exemple ci-dessus, je souhaiterais supprimer l'élément p3 d'une liste en fonction de la date enregistré dans l'attribut "date".

    Merci d'avance.

  2. #2
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Points : 2 373
    Points
    2 373
    Par défaut
    Tu dois donc passer ton critère de sélection dans la requête de sélection et utiliser l'opérateur positionnel $ pour supprimer uniquement cet élément là de ton tableau

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    > db.test.insert({"list":[{"p3": {"toto":"titi"}}, {"p3":{"tata":"tutu"}}]})
    > db.test.insert({"list":[{"p3": {"teto":"titi"}}, {"p3":{"tata":"tutu"}}]})
    Ma requête de sélection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > db.test.find({'list.p3.toto':'titi'})
    { "_id" : ObjectId("51dfadd46b966fe7949cc1c8"), "list" : [ { "p3" : { "toto" : "titi" } }, { "p3" : { "tata" : "tutu" } } ] }
    Avec update pour dégager l'objet p3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > db.test.update({'list.p3.toto':'titi'},{$unset:{'list.$.p3':""}})
    > db.test.find()
    { "_id" : ObjectId("51dfadd46b966fe7949cc1c8"), "list" : [ { }, { "p3" : { "tata" : "tutu" } } ] }
    { "_id" : ObjectId("51dfade76b966fe7949cc1c9"), "list" : [ { "p3" : { "teto" : "titi" } }, { "p3" : { "tata" : "tutu" } } ] }
    ou bien uniquement l'attribut toto :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > db.test.update({'list.p3.toto':'titi'},{$unset:{'list.$.p3.toto':""}})
    > db.test.find()
    { "_id" : ObjectId("51dfade76b966fe7949cc1c9"), "list" : [ { "p3" : { "teto" : "titi" } }, { "p3" : { "tata" : "tutu" } } ] }
    { "_id" : ObjectId("51dfafc21ec61d52f9fca6ac"), "list" : [ { "p3" : { } }, { "p3" : { "tata" : "tutu" } } ] }
    a+

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 57
    Points : 41
    Points
    41
    Par défaut
    merci , pour ta réponse mais ma requête doit posséder une certaine condition, ce que j'aimerais faire c'est un truc du genre :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    db.food.update({"name":"noc"},{$unset:{"list.$.date":{$lt: new Date()}}});
    et ainsi supprimer tous les attributs qui valent '$' si leur date est dépassée.

  4. #4
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Points : 2 373
    Points
    2 373
    Par défaut
    eh bien il te faut donc mettre ta condition dans la requête de sélection et non dans la partie "update".
    Si tu veux changer toutes les dates présentes dans une liste alors met ta condition de requêtage à gauche, pas à droite.

    list.date : {$lt : maDate } => devrait être dans la requête de sélection

    Reprends l'exemple que j'ai donné, remplace la requête de sélection
    {'list.p3.toto':'titi'} par ta requête sur la sélection de la date et ca revient au même

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 57
    Points : 41
    Points
    41
    Par défaut
    voici ce que j'ai essayé :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    db.test.update({"list.$.date":{$lt: new Date()},{$unset:{"list.$.date":""}});
    ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    db.test.update({"list.date":{$lt: new Date()},{$unset:{"list.$.date":""}});
    et cela ne fonctionne pas

    voici la structure json :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
     
    > db.test.findOne();
    {
            "_id" : ObjectId("51e7dd16d2f8db27b56ea282"),
            "ad" : "noc2",
            "list" : {
                    "p45" : {
                            "date" : ISODate("2014-01-01T12:18:30.568Z"),
                            "value3" : 21,
                            "value1" : 100,
                            "value2" : 489
                    },
                    "p6" : {
                            "date" : ISODate("2013-07-18T12:18:30.568Z"),
                            "value3" : 21,
                            "value1" : 100,
                            "value2" : 489
                    },
                    "p4578" : {
                            "date" : ISODate("2013-07-18T12:18:30.568Z"),
                            "value3" : 21,
                            "value1" : 100,
                            "value2" : 489
                    }
            }
    }

  6. #6
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Points : 2 373
    Points
    2 373
    Par défaut
    Ta requête de sélection est incorrecte

    list.date":{$lt: new Date()}

    list.date n'existe pas, tes champs dates sont encapsulés dans des sous objets p6, p45 etc...

    Pourquoi ne ne pas avoir fait plutot ca ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    list" : [
                  {
                            "name" : "p45",
                            "date" : ISODate("2014-01-01T12:18:30.568Z"),
                            "value3" : 21,
                            "value1" : 100,
                            "value2" : 489
                    },
                     {   "name" : "48",
                            "date" : ISODate("2013-07-18T12:18:30.568Z"),
                            "value3" : 21,
                            "value1" : 100,
                            "value2" : 489
                    },
                    {
                           "name" : 478",
                            "date" : ISODate("2013-07-18T12:18:30.568Z"),
                            "value3" : 21,
                            "value1" : 100,
                            "value2" : 489
                    }
    ]
    Ca te n'aurait pas simplifié la vie en requêtage ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 57
    Points : 41
    Points
    41
    Par défaut
    non car en fait mon json n'est rien d'autre qu'une Hashmap <String,Hashmap<String,Object> sérialisé et par conséquent lors de sa sérialisation - déserialisation j'aurais quelques gros soucis de performance... si ma structure est comme dans ton exemple.

  8. #8
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Points : 2 373
    Points
    2 373
    Par défaut
    Je vais répondre ici pour les deux threads, ca sera plus simple.
    En fait, même si c'est une hashmap, ce qui t'intéresse c'est la liste des valeurs (puisque les clés sont contenues dans tes valeurs).
    Si ce sont des hashmap java, c'est le values() qui nous intéresse, pas la pair clé/valeur.

    Le souci en ayant un objet qui contient des objets c'est que tu ne peux pas faire de recherche sur un sous objet de la forme a.*.c, c'est a priori ce qui t'intéresserait mais ce n'est pas possible.
    Or ton cas d'usage (Cf tes deux threads), c'est plutot d'accéder à un élément de c quelque soit b.
    C'est difficile de répondre en ne connaissant pas toutes tes contraintes (pourquoi ce choix de structure etc...) mais il semblerait que ton usage en sélection ne correspond pas à ton usage en stockage.

    Pour la framework d'aggrégation, il faut le voir comme un pipeline de traitement. Il te permettrait d'effectuer un éclatement de tes listes, des filtres, des transformations. J'ai des slides (issu d'une formation que je donne sur le sujet) si ca t'intéresse.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 57
    Points : 41
    Points
    41
    Par défaut
    Oui je veux bien que tu m'envois tes cours, ce serait sympa

Discussions similaires

  1. Requête UPDATE sur HF et position fichier
    Par Hibernatus34 dans le forum HyperFileSQL
    Réponses: 4
    Dernier message: 26/10/2012, 16h10
  2. [AC-2003] Requête update sur trois tables
    Par Jojo____ dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 24/05/2012, 10h44
  3. Réponses: 2
    Dernier message: 04/12/2010, 00h00
  4. [AC-2003] Requête UPDATE sur une table sans relation
    Par SIGER_971 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 09/07/2009, 09h02
  5. Requête update sur Msysobjects
    Par Jean-Philippe André dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 29/10/2007, 16h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo