web-dev-qa-db-fra.com

Forcer mongodb à produire du JSON strict

Je veux utiliser la sortie brute de certaines commandes MongoDB dans d'autres programmes qui parlent JSON. Lorsque j'exécute des commandes dans le shell mongo, elles représentent les champs JSON étendu , en "Mode shell", avec des champs spéciaux tels que NumberLong, Date et Timestamp. Je vois dans la documentation des références au "mode strict", mais je ne vois aucun moyen de l'activer pour le shell ni d'exécuter des commandes telles que db.serverStatus() dans des choses qui do produisait du JSON strict, comme mongodump. Comment puis-je forcer Mongo à produire du JSON conforme aux normes?

Il y a plusieursautresquestions sur ce sujet, mais je ne trouve aucune de leurs réponses particulièrement satisfaisante.

23
whereswalden

Le shell MongoDB parle Javascript, la réponse est simple: utilisez JSON.stringify(). Si votre commande est db.serverStatus(), alors vous pouvez simplement faire ceci:

JSON.stringify(db.serverStatus())

Cela ne produira pas la représentation "en mode strict" appropriée de chacun des champs ({ "floatApprox": <number> } au lieu de { "$numberLong": "<number>" }), mais si ce qui vous préoccupe, c'est d'obtenir du JSON conforme aux normes, cela fera l'affaire.

23
whereswalden

Je n'ai pas trouvé de moyen de le faire dans le shell mongo, mais comme solution de contournement, mongoexport peut exécuter des requêtes et sa sortie utilise un mode strict et peut être acheminée vers d'autres commandes qui attendent une entrée JSON (telle que json_pp ou jq Par exemple, supposons que vous ayez la commande suivante mongo Shell pour exécuter une requête et que vous souhaitiez créer un pipeline utilisant ces données:

db.myItemsCollection.find({creationDate: {$gte: ISODate("2016-09-29")}}).pretty()

Convertissez cette commande Shell mongo en cette commande Shell, canalisant l'exemple par exemple en `json_pp:

mongoexport --jsonArray -d myDbName -c myItemsCollection -q '{"creationDate": {"$gte": {"$date": "2016-09-29T00:00Z"}}}' | json_pp

Vous devrez convertir la requête au format en mode strict, puis passer le nom de la base de données et le nom de la collection sous forme d'arguments, ainsi que la citation correcte pour votre shell, comme indiqué ici.

5
jbyler

Pour tirer parti de la réponse de @jbyler, vous pouvez supprimer les numberLongs à l’aide de sed après avoir obtenu vos données, c’est-à-dire si vous utilisez Linux.

mongoexport --jsonArray -d dbName -c collection -q '{fieldName: {$regex: ".*turkey.*"}}' | sed -r 's/\{ "[$]numberLong" : "([0-9]+)" }/"\1"/g' | json_pp
0
Kieveli