0
votes

Exporter MongoDB sur CSV à l'aide de nœud.js mais perdez une colonne

Je veux exporter une table sur CSV à partir de MongoDB à l'aide de ce script:

const mongodb = require("mongodb").MongoClient;
const fastcsv = require("fast-csv");
const fs = require("fs");
let url = "mongodb://...."

mongodb.connect(
  url,
  { useNewUrlParser: true, useUnifiedTopology: true },
  (err, client) => {
    if (err) throw err;

    client
      .db("mydb")
      .collection("mycsv")
      .find({})
      .toArray((err, data) => {
        if (err) throw err;

        console.log(data);
        fastcsv
          .write(data, { headers: true })
          .on("finish", function() {
            console.log("Write to mycsv.csv successfully!");
          })
          .pipe(fs.createWriteStream("mycsv.csv"));

        client.close();
      });
  }
);


2 commentaires

Pouvez-vous fournir la structure de données des documents et quelles colonnes contiennent null valeurs?


Regardez ma solution Stackoverflow.com/a/59799747/10831557


4 Réponses :


0
votes

Je pense que le problème peut être que vous ne fournissez aucune information d'en-tête à Fast-CSV. Dans les docs, il indique: xxx

vous définissez "les en-têtes" sur true, ce qui pourrait entraîner une interprétation de la première ligne de données comme des en-têtes, ce qui signifie que si plusieurs colonnes ont une "null" Valeur comme valeur de données, que ces colonnes seraient fusionnées et que vous perdez les données.

mais sans informations supplémentaires, il est vraiment difficile de dire quelque chose. Postez votre console.Log des 10 premières entrées de données pour vérifier.

Essayez d'exclure les en-têtes, en réglant xxx


1 commentaires

Désolé, ça ne marche pas. Le journal de la console ne renvoie pas les colonnes manquantes. Je pense donc que le problème est avant fastcsv



0
votes

de la DOCS:

TOUJOURSWRITEHeaders: {Boolean} = FALSE: défini sur true si vous voulez toujours des en-têtes écrits, même si aucune ligne de lignes n'est écrite. Remarque Cela lancera une erreur si les en-têtes ne sont pas spécifiés comme une matrice.


0 commentaires

0
votes

Vous pouvez utiliser le csvwriter code> au lieu de fastcsv code> suivant

D'abord installer ce package de nœud. CSVWriter code> NPM I CSV-Writer --Save code> ( Link ) de
de
Ensuite, dans votre index.js ou où vous voulez votre fonction. Écrivez le code suivant.

const createCsvWriter = require('csv-writer').createObjectCsvWriter;
client
.db("mydb")
.collection("mycsv")
.find({})
.toArray((err, data) => {
    if (err) throw err;

    console.log(data); //data must be an array of objects
    const csvWriter = createCsvWriter({
        path: './std_folder/Hanuman Madhi.csv',

        header: [
        {id: 'name', title: 'Name'}, //here id means the key of object and title means the header name displayed on the very first row of csv
        {id: 'std', title: 'Std'},
        {id: 'address', title: 'Address'},
        ]
    });



    csvWriter
    .writeRecords(data)
    .then(()=> console.log('The CSV file was written successfully'));
     client.close();
});


0 commentaires

0
votes

Vous devez fournir des noms exacts des clés à l'intérieur de votre collection pour contourner ce problème

FAST-CSV, puis correspond à chaque touche avec des valeurs à l'intérieur de chaque document et affichera toutes les valeurs pour lesquelles vous avez des clés spécifiées comme suit,

Changez cette ligne dans laquelle vous spécifiez des en-têtes comme suit xxx

espère que cela aide


2 commentaires

Le problème est sur la collection de la recherche


S'il vous plaît partager l'échantillon JSON que vous obtenez de la recherche de collection, qui serait utile