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 :

[MongoDB] camel-mongodb date id problems


Sujet :

NoSQL

  1. #1
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut [MongoDB] camel-mongodb date id problems
    Bonjour.

    j'utilise apache camel pour injecter des données dans une base mongoDB
    le fonctionnement est très simple
    camel définit des routes.
    les données arrivent en entrée par un canal (quelconque) sont converties automatiquement si besoin est sont envoyé à une ou plusieurs sorties
    ma route est la suivante
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
           <cl:route id="mongo-http-insert">
              <cl:from uri="jetty:http://0.0.0.0:9090/myapp/mongoInsert?httpMethodRestrict=POST"/>
              <cl:setHeader headerName="CamelHttpMethod"><cl:constant>POST</cl:constant></cl:setHeader>
              <cl:setHeader headerName="CamelMongoDbUpsert"><cl:constant>true</cl:constant></cl:setHeader>
              <cl:to uri="mongodb:myDb?database=suivi&amp;collection=testData&amp;writeResultAsHeader=true&amp;writeConcern=SAFE&amp;operation=save" />
              <cl:to uri="log:Insert" />
              <cl:setBody><cl:simple>${header.CamelMongoOid}</cl:simple></cl:setBody>
              <cl:to uri="mongodb:myDb?database=suivi&amp;collection=testData&amp;writeResultAsHeader=true&amp;writeConcern=SAFE&amp;operation=findById" />
              <cl:setHeader headerName="Content-Type"><cl:constant>application/json</cl:constant></cl:setHeader>
           </cl:route>
    pour ceux qui ne connaissent pas camel
    je suis à l'écoute de http://0.0.0.0:9090/myapp/mongoInsert uniquement en POST
    j'indique que j'accepte le mode insert or update
    et l'envoi à mongoDB
    le point important operation=save qui assure le insert or update.
    pour que cela fonctionne il faut mettre dans le corp du POST un paquet JSON
    vu que c'est du HTTP c'est obligatoirement du texte.
    l'étape suivante et de logger l'échange histoire d'en garder la trace.
    lorsque les données sont insérées j'ai dans un header associé à mon échange l'OID généré par la base.
    Je remplace le JSON de l'échange par l'OID et j'envois une recherche à la base. operation=findById
    cela me retourne un paquet JSON qui est ce qui a été inséré dans la base.
    je fixe le header HTTP pour dire que la réponse est en JSON

    voici ce que j'obtiens: envoi
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {
       "cool": "MongoDb",
       "name": "Sekaijin"
    }
    retour
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    {
       "_id": {
          "$oid": "5798b871cfa9d41d40b73994"
       },
       "cool": "MongoDb",
       "name": "Sekaijin"
    }
    Jusque là c'est magique. comme je suis en insert or update je dois pouvoir mettre à jour mes données
    j'envoi donc
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    {
       "_id": {
          "$oid": "5798b871cfa9d41d40b73994"
       },
       "cool": "MongoDB",
       "name": "Sekaijin"
    }
    MongoDb=>MongoDB
    et là ça plante. la raison est que BSON ne sait pas décoder "$oid"J'ai donc regardé plusieurs cas avec $.
    comme $currentDatedès qu'il y a $ j'ai un message du type
    Invalid BSON field name $oid.

    si je mets $oid sans les quote vu qu'il fait un (DBObject)JSON.parse (..) il plante sur le JSON.parse.
    c'est pire avec ObjectId("5798e5bfcfa9d4180ce9a0aa").

    comment représenter l'ID pour qu'il fasse un update ?
    comment représenter une date pour qu'il y ait dans la base une date et pas un string ou un NumberLong("1469637143762").
    A+JYT
    PS: je n'ai aucune ligne de code (Java) je place le xml dans un fichier blueprint(spring like) dans karaf. ça fonctionne sans rien d'autre.
    J'ai trouvé sur le net le convertisseur camel qui assure la transformation
    https://github.com/apache/camel/blob...onverters.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        @Converter
        public static DBObject fromStringToDBObject(String s) {
            DBObject answer = null;
            try {
                answer = (DBObject) JSON.parse(s);
            } catch (Exception e) {
                LOG.warn("String -> DBObject conversion selected, but the following exception occurred. Returning null.", e);
            }
     
            return answer;
        }

  2. #2
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    Bonjour

    je relance aussi cette discussion
    je n'ai trouvé sur le net aucune solution.

    pour le moment j'en reste à cette situation
    j'insère un document dans ma collection
    j'obtient un JSON en réponse
    et ce JSON ne peut pas être utilisé pour insérer une modification du document.

    vu que cela me semble le B.A.BA. d'une base de donnée j'imagine qu'il doit y avoir une solution.
    Sans cette réponse j'abandonnerais mongoDB non pour ses qualités mais par manque de doc claire sure des fonction primitive.
    Si une fonction aussi simple me prends plusieurs mois à résoudre je n'ose imaginer ce qu'il en sera lorsque sera compliqué.

    si donc vous avez une solution je vous remercie par avance.
    A+JYT

  3. #3
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    Bonjour
    Faute de trouver une solution, je suis entré dans le code de Camel.
    Et il en résulte une nouvelle version du connecteur
    Camel-mongodb3
    Qui utilise la version 3 du driver mongodb et les classes de ce dernier.
    Fini les cast après un json.parse
    On utilise directement les documents mongo
    Document.parse.
    Ce qui résous tous les problèmes de $xxx

    Il est dispo dans le trunk du projet Camel
    A+

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/11/2016, 13h21
  2. [Apache Camel] MongoDB product A vers product B
    Par awnet dans le forum Plateformes réactives et architectures modulaires
    Réponses: 5
    Dernier message: 25/04/2013, 17h29
  3. Camel JNDI et JDBC probleme
    Par sekaijin dans le forum JDBC
    Réponses: 1
    Dernier message: 27/03/2012, 09h12
  4. [XL-2007] Import fichier CSV date pose probleme
    Par guy2004 dans le forum Excel
    Réponses: 3
    Dernier message: 31/01/2012, 06h44

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