2011-04-22 4 views
2

je dois communiquer avec shell MongoDB via Java
Pour expliquer en un mot, je me sers quelque chose comme Runtime.exec (communes exec spécifiquement) pour appeler MongoDB shell in --eval modeMongoDB - Comment consommer printjson sortie en Java

En utilisant cette approche, je suis en mesure d'invoquer avec succès les commandes MongoDB, récupérer la sortie dans un flux (et imprimer sur stdout par exemple)

Tout va bien jusqu'à ce point.

Je dois maintenant « analyser » cette sortie en quelque chose comme un tableau de JSONObject
(je peux utiliser une bibliothèque JSON comme Jackson, etc. qui peuvent convenir à ce sujet) afin que je puisse "masser" la sortie en fonction de certaines exigences. (Changer le format, supprimer des paires de valeurs clés, etc.)

Lorsque je regarde la sortie générée par printjson dans le cas de tableaux au moins, il ne semble pas être un tableau json valide mais plutôt des objets json valides séparés par une nouvelle ligne sans la virgule entre les deux ou en entourant [] cela en ferait un tableau valide.

Dans ce cas, des suggestions sur la façon d'analyser cette sortie dans un certain type d'objets support que je peux utiliser pour lire/modifier des paires de valeurs clés?

Je n'ai pas les commandes de JSON au moment de la compilation, mais ne sais que ces commandes se termineront toujours dans un printjson

EDIT -

Donc, pour simplifier, par exemple, je cherche un moyen pour analyser la sortie suivante en Java Objects -
(les paires de clés individuelles/valeur ne sont pas connus au moment de la compilation)


{ 
    "_id" : ObjectId("4db0e0289523f82ff6cd90d4"), 
    "calendar_date" : "2009-11-10", 
    "product_id" : 8, 
    "channel" : "website", 
    "country" : "USA", 
    "total_unit_count" : 740, 
    "total_amount" : 11367.29 
} 
{ 
    "_id" : ObjectId("4db0e0289523f82ff6cd90d5"), 
    "calendar_date" : "2009-11-10", 
    "product_id" : 8, 
    "channel" : "website", 
    "country" : "Australia", 
    "total_unit_count" : 740, 
    "total_amount" : 13893.09 
} 
{ 
    "_id" : ObjectId("4db0e0289523f82ff6cd90d6"), 
    "calendar_date" : "2009-11-10", 
    "product_id" : 8, 
    "channel" : "retail", 
    "country" : "USA", 
    "total_unit_count" : 13, 
    "total_amount" : 8296.89 
} 
+0

Vous utiliseriez un analyseur Java JSON, dont plusieurs sont répertoriés sur l'un des sites que vous liez. http://json.org/ –

+1

Y at-il une raison pour laquelle vous ne voulez pas utiliser le pilote Java MongoDB? L'objet support dans ce cas serait DBObject et votre code sera beaucoup plus propre que la sortie JSON d'évaluation eval'd. – lobster1234

+0

@lobster - Ce programme java doit accepter les commandes javascript donc je ne suis pas sûr de savoir comment/si je pouvais utiliser le pilote Java. –

Répondre

0

Ce que je cherchais ne semble pas possible pour le moment. Ce que j'ai fini par faire était de débourser les appels de mongo, obtenir le flux de résultat dans java, JSONize le résultat (se débarrasser de object_id puisque je n'en ai pas besoin, convertir des dates appropriées, etc.) et puis générer un json objet de cette chaîne de résultat modifiée. Hack hack mais le seul qui semblait possible et ça marche.

Si vous vous trouvez dans un bateau similaire et que vous avez des questions spécifiques, postez dans le commentaire ci-dessous et je vous aiderai si je le peux.

1

Vous pouvez exécuter quoi que ce soit vous pouvez écrire en javascript directement dans java (en utilisant le pilote mongodb java).

C'est une mauvaise idée de débourser et d'essayer de consommer la sortie de Java. Au lieu de cela, vous devez exécuter les commandes/requêtes directement à partir de Java en utilisant le pilote.

+0

J'ai un système hérité qui "produit" des requêtes pour le shell mongo. Êtes-vous en train de dire que je peux prendre ces requêtes en texte brut que le shell comprend et les transmettre au pilote mongo java tel quel? quelle méthode? La dernière fois que j'ai vérifié, il n'y avait rien dans le pilote mongo java qui permettrait cela. –

+1

Vous pouvez utiliser JSON.parse (...) pour convertir une chaîne JSON en DBObject que vous pouvez utiliser comme restriction de requête. Cela vous permet de prendre une chaîne comme ceci: '{field:" value "}' et d'exécuter une requête avec. –

+0

Merci de donner plus de réflexion à la question mais les requêtes ne sont pas json, ils sont javascript, à l'origine destiné à être exécuté contre le shell mongo. –

0

il semble que com.mongodb.util.JSON ne s'étend pas DBObject, je ne sais pas pourquoi les gens prétendent que vous pouvez faire collection.insert (JSON.parse (certains json)). y a-t-il une autre façon d'insérer le json qui me manque?

edit: la réponse est facile ici, mais n'est pas dans la documentation. il suffit d'ajouter une distribution:

collection.insert((DBObject)JSON.parse(some json ...)); 
Questions connexes