db.collection não é uma function ao usar o MongoClient v3.0

Eu tenho tentado o tutorial do W3schools em nodeJS com o MongoDB.

Quando tento implementar este exemplo em um ambiente nodeJS e invoco a function com uma chamada AJAX, recebo o erro abaixo:

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) 

Por favor, encontre abaixo o meu código implementado:

 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(); }); }); 

Observe que o erro ocorre sempre que a execução ocorrer:

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

Além disso, observe (no caso de ter importância) que instalei o pacote mais recente do MongoDB para o nó JS ( npm install mongodb ), e a versão do MongoDB é o MongoDB Enterprise 3.4.4, com o driver MongoDB Node.js v3.0.0-rc0.

Eu encontrei a mesma coisa. Em package.json, mude a linha mongodb para “mongodb”: “^ 2.2.33”. Você precisará desinstalar o mongodb do npm; em seguida, instalar o npm para instalar esta versão.

Isso resolveu o problema para mim. Parece ser um bug ou os documentos precisam ser atualizados.

Para pessoas na versão 3.0 do driver NodeJS nativo do MongoDB:

(Isto é aplicável para pessoas com “mongodb”: “^ 3.0.0-rc0”, ou uma versão posterior em package.json, que deseja continuar usando a última versão.)

Na versão 2.x do driver NodeJS nativo do MongoDB, você obteria o object de database como um argumento para o retorno de chamada de conexão:

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

De acordo com o changelog para o 3.0, você agora obtém um object cliente contendo o object de database:

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

O método close() também foi movido para o cliente. O código na questão pode, portanto, ser traduzido para:

 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(); }); }); 

Para aqueles que querem continuar usando a versão ^ 3.0.1, esteja ciente das mudanças em como você usa o método MongoClient.connect() . O retorno de chamada não retorna o db vez disso, ele retorna o client , em relação ao qual existe uma function chamada db(dbname) que você deve chamar para obter a instância do db que está procurando.

 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(); }); 

Piggy Backing na resposta do @MikkaS para o Mongo Client v3.x, eu só precisava do formato async / await, que parece um pouco modificado desta forma:

 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. } 

Eu resolvi facilmente através da execução destes códigos:

  npm uninstall mongodb --save npm install mongodb@2.2.33 --save 

Codificação Feliz!

  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); }); }) }) 

O único problema com o seu código é que você está acessando o object que está segurando o database. Você deve acessar o database diretamente (consulte a variável de database acima). Esse código retornará seu database em uma matriz e, em seguida, percorre e registra o nome de todos no database.

Eu tenho o shell MongoDB versão v3.6.4, código abaixo use mongoclient, é bom para mim:

 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()"); });