web-dev-qa-db-fra.com

db.collection n'est pas une fonction lors de l'utilisation de MongoClient v3.0

J'ai essayé tutoriel W3schools sur nodeJS avec MongoDB.

Lorsque j'essaie d'implémenter cet exemple dans un environnement nodeJS et d'invoquer la fonction avec un appel AJAX, j'ai l'erreur ci-dessous:

TypeError: db.collection is not a function
    at c:\Users\user\Desktop\Web Project\WebService.JS:79:14
    at args.Push (c:\Users\user\node_modules\mongodb\lib\utils.js:431:72)
    at c:\Users\user\node_modules\mongodb\lib\mongo_client.js:254:5
    at connectCallback (c:\Users\user\node_modules\mongodb\lib\mongo_client.js:933:5)
    at c:\Users\user\node_modules\mongodb\lib\mongo_client.js:794:11
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickCallback (internal/process/next_tick.js:104:9)

Veuillez trouver ci-dessous mon code implémenté:

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mytestingdb";

MongoClient.connect(url, function(err, db) {
  if (err) throw err;
  db.collection("customers").findOne({}, function(err, result) {
    if (err) throw err;
    console.log(result.name);
    db.close();
  });
});

Notez que l'erreur se produit chaque fois que l'exécution frappe:

db.collection("customers").findOne({}, function(err, result) {}

Notez également (au cas où cela compte) que j'ai installé le dernier package MongoDB pour le noeud JS ( npm install mongodb ) et que la version de MongoDB est MongoDB. Enterprise 3.4.4, avec le pilote MongoDB Node.js v3.0.0-rc0.

102
Elie Asmar

J'ai rencontré la même chose. Dans package.json, remplacez la ligne mongodb par "mongodb": "^ 2.2.33". Vous aurez besoin de npm uninstall mongodb; puis npm install pour installer cette version.

Cela a résolu le problème pour moi. Cela semble être un bogue ou la documentation doit être mise à jour.

67
AyoO

Pour les utilisateurs de la version 3.0 du pilote NodeJS natif de MongoDB:

(Ceci s'applique aux personnes avec "mongodb": "^ 3.0.0-rc0", ou une version ultérieure de package.json, souhaitant continuer à utiliser la dernière version.)

Dans la version 2.x du pilote natif MongoDB de NodeJS , vous obtiendrez l'objet de base de données en tant qu'argument du rappel de connexion:

MongoClient.connect('mongodb://localhost:27017/mytestingdb', (err, db) => {
  // Database returned
});

Selon le changelog for 3.0, vous obtenez maintenant un objet client contenant l'objet de base de données:

MongoClient.connect('mongodb://localhost:27017', (err, client) => {
  // Client returned
  var db = client.db('mytestingdb');
});

La méthode close() a également été déplacée vers le client. Le code de la question peut donc être traduit en:

MongoClient.connect('mongodb://localhost', function (err, client) {
  if (err) throw err;

  var db = client.db('mytestingdb');

  db.collection('customers').findOne({}, function (findErr, result) {
    if (findErr) throw findErr;
    console.log(result.name);
    client.close();
  });
}); 
388
MikaS

Pour ceux qui souhaitent continuer à utiliser la version ^ 3.0.1, tenez compte des modifications apportées à la manière dont vous utilisez la méthode MongoClient.connect(). Le rappel ne renvoie pas dbname__, mais plutôt clientname__, pour lequel il existe une fonction appelée db(dbname) que vous devez appeler pour obtenir l'instance dbque vous recherchez.

const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');

// Connection URL
const url = 'mongodb://localhost:27017';

// Database Name
const dbName = 'myproject';

// Use connect method to connect to the server
MongoClient.connect(url, function(err, client) {
  assert.equal(null, err);
  console.log("Connected successfully to server");

  const db = client.db(dbName);

  client.close();
});
28
ra9r
        MongoClient.connect(url (err, db) => {
        if(err) throw err;

        let database = db.db('databaseName');

        database.collection('name').find()
        .toArray((err, results) => {
         if(err) throw err;
         results.forEach((value)=>{
          console.log(value.name);
         });
        })
      })

Le seul problème avec votre code est que vous accédez à l'objet qui contient la base de données. Vous devez accéder directement à la base de données (voir variable de base de données ci-dessus). Ce code renverra votre base de données dans un tableau, puis il le parcourra en boucle et enregistrera le nom de tous les utilisateurs de la base de données.

14
Dre Jackson

Piggy backing sur @MikkaS answer pour Mongo Client v3.x, il me fallait juste le format async/wait, qui semble légèrement modifié comme ceci:

const myFunc = async () => {

     // Prepping here...


    // Connect
    let client = await MongoClient.connect('mongodb://localhost');
    let db = await client.db();

    // Run the query
    let cursor = await db.collection('customers').find({});

    // Do whatever you want on the result.
}
11
agarcian

Je l'ai résolu facilement en exécutant ces codes:

 npm uninstall mongodb --save

 npm install [email protected] --save

Bon codage!

5
Saurabh Singh

J'ai MongoDB Shell version v3.6.4, le code ci-dessous utilise mongoclient, c'est bon pour moi:

var MongoClient = require('mongodb').MongoClient,
assert = require('assert');
var url = 'mongodb://localhost:27017/video';
MongoClient.connect(url,{ useNewUrlParser: true }, function(err, client) 
{
assert.equal(null, err);
console.log("Successfully connected to server");
var db = client.db('video');
// Find some documents in our collection
db.collection('movies').find({}).toArray(function(err, docs) {
// Print the documents returned
docs.forEach(function(doc) {
console.log(doc.title);
});
// Close the DB
client.close();
});
// Declare success
console.log("Called find()");
 });
3
Gianluca Mazzeo

J'ai fait quelques essais pour voir si je pouvais conserver le nom de la base de données dans l'URL. Je préfère la syntaxe de promesse, mais cela devrait quand même fonctionner pour la syntaxe de rappel. Notez que client.db () est appelé sans passer aucun paramètre.

MongoClient.connect(
    'mongodb://localhost:27017/mytestingdb', 
    { useNewUrlParser: true}
)
.then(client => {

    // The database name is part of the url.  client.db() seems 
    // to know that and works even without a parameter that 
    // relays the db name.
    let db = client.db(); 

    console.log('the current database is: ' + db.s.databaseName);
    // client.close() if you want to

})
.catch(err => console.log(err));

Mes listes package.json monbodb ^ 3.2.5.

L'option 'useNewUrlParser' n'est pas requise si vous souhaitez traiter un avertissement de dépréciation. Mais il est sage d’utiliser à ce stade jusqu’à ce que la version 4 sorte, où le nouveau pilote sera vraisemblablement le pilote par défaut et vous n’aurez plus besoin de cette option.

1
pwilcox

Les requêtes MongoDB renvoient un curseur sur un tableau stocké en mémoire. Pour accéder au résultat de ce tableau, vous devez appeler .toArray() à la fin de la requête.

  db.collection("customers").find({}).toArray() 
1
pmpc2