db.collection не является функцией при использовании MongoClient v3.0

Я пробовал учебник W3schools на nodeJS с MongoDB.

Когда я пытаюсь реализовать этот пример в среде nodeJS и вызывать функцию с помощью вызова AJAX, я получаю ошибку ниже:

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)

Пожалуйста, найдите ниже мой реализованный код:

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

Обратите внимание, что ошибка возникает всякий раз, когда выполняется попадание:

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

Также обратите внимание (в случае, если это имеет значение), что я установил последний пакет MongoDB для узла JS (npm install mongodb), и версия MongoDB - MongoDB Enterprise 3.4.4, с драйвером MongoDB Node.js v3.0.0-rc0.

13 ответов

Решение

Я столкнулся с тем же самым. В package.json измените строку mongodb на "mongodb": "^2.2.33". Вам нужно удалить npm mongodb; затем npm установить, чтобы установить эту версию.

Это решило проблему для меня. Кажется, это ошибка, или документы должны быть обновлены.

Для людей с версией 3.0 собственного драйвера MongoDB NodeJS:

(Это применимо к людям с "mongodb": "^3.0.0-rc0" или более поздней версией в package.json, которые хотят продолжать использовать последнюю версию.)

В версии 2.x собственного драйвера NodeJS MongoDB вы бы получили объект базы данных в качестве аргумента обратного вызова connect:

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

Согласно журналу изменений для 3.0 теперь вы получаете объект client, содержащий объект базы данных:

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

close() метод также был перенесен на клиента. Поэтому код в вопросе может быть переведен на:

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

Тем, кто хочет продолжить использование версии ^3.0.1, следует помнить об изменениях в том, как вы используете MongoClient.connect() метод. Обратный звонок не возвращается db вместо этого он возвращает client, против которого есть функция под названием db(dbname) что вы должны призвать, чтобы получить db экземпляр, который вы ищете.

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

Единственная проблема с вашим кодом - это доступ к объекту, который содержит базу данных. Вы должны получить доступ к базе данных напрямую (см. Переменную базы данных выше). Этот код вернет вашу базу данных в виде массива, а затем пройдет по ней и зарегистрирует имя для всех в базе данных.

В ответ на ответ @MikkaS для Mongo Client v3.x мне просто нужен был формат async / await, который выглядит немного измененным, как это:

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

Я немного поэкспериментировал, чтобы увидеть, смогу ли я сохранить имя базы данных как часть URL-адреса. Я предпочитаю синтаксис обещания, но он все равно должен работать для синтаксиса обратного вызова. Обратите внимание, что client.db() вызывается без передачи каких-либо параметров.

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

В моем package.json перечислены monbodb ^3.2.5.

Параметр useNewUrlParser не требуется, если вы хотите иметь дело с предупреждением об устаревании. Но разумно использовать на этом этапе, пока не выйдет версия 4, где, предположительно, новый драйвер будет по умолчанию, и вам больше не понадобится эта опция.

Раньше он работал со старыми версиями клиента MongoDb ~ 2.2.33

Вариант 1. Таким образом, вы можете использовать старую версию

npm uninstall mongodb --save

npm install mongodb@2.2.33 --save

Вариант 2. Продолжайте использовать более новую версию (3.0 и выше) и немного измените код.

let MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://localhost:27017', function(err, client){
  if(err) throw err;
  let db = client.db('myTestingDb');
  db.collection('customers').find().toArray(function(err, result){
    if(err) throw err;
    console.log(result);
    client.close();
    });
 });

Если кто-то все еще пытается решить эту ошибку, я сделал это, как показано ниже.

const MongoClient = require('mongodb').MongoClient;
// Connection URL
const url = 'mongodb://localhost:27017';
// Database Name
const dbName = 'mytestingdb';

const retrieveCustomers = (db, callback)=>{
    // Get the customers collection
    const collection = db.collection('customers');
    // Find some customers
    collection.find({}).toArray((err, customers) =>{
        if(err) throw err;
      console.log("Found the following records");
      console.log(customers)
      callback(customers);
    });
}

const retrieveCustomer = (db, callback)=>{
    // Get the customers collection
    const collection = db.collection('customers');
    // Find some customers
    collection.find({'name': 'mahendra'}).toArray((err, customers) =>{
        if(err) throw err;
      console.log("Found the following records");
      console.log(customers)
      callback(customers);
    });
}

const insertCustomers = (db, callback)=> {
    // Get the customers collection
    const collection = db.collection('customers');
    const dataArray = [{name : 'mahendra'}, {name :'divit'}, {name : 'aryan'} ];
    // Insert some customers
    collection.insertMany(dataArray, (err, result)=> {
        if(err) throw err;
        console.log("Inserted 3 customers into the collection");
        callback(result);
    });
}

// Use connect method to connect to the server
MongoClient.connect(url,{ useUnifiedTopology: true }, (err, client) => {
  console.log("Connected successfully to server");
  const db = client.db(dbName);
  insertCustomers(db, ()=> {
    retrieveCustomers(db, ()=> {
        retrieveCustomer(db, ()=> {
            client.close();
        });
    });
  });
});

Я решил это легко, запустив эти коды:

 npm uninstall mongodb --save

 npm install mongodb@2.2.33 --save

Удачного кодирования!

У меня версия оболочки MongoDB v3.6.4, код ниже, используйте mongoclient, это хорошо для меня:

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

Запросы MongoDB возвращают курсор к массиву, хранящемуся в памяти. Чтобы получить доступ к результату этого массива, вы должны вызвать .toArray() в конце запроса.

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

Недавно у меня была такая же проблема, я, наконец, решил ее, используя документацию официального сайта MongoDB и примеры кодов.

Моя версия клиента MongoDB«mongodb»: «^ 4.4.1» , и мне наконец удалось вставить документ без необходимости понижать версию моего пакета MongoDB в соответствии с утвержденным ответом, который кажется устаревшим.

      import { MongoClient } from "mongodb";

// Replace the uri string with your MongoDB deployment's connection string.
const uri = "<connection string uri>";

const client = new MongoClient(uri);

async function run() {
  try {
    await client.connect();

    const database = client.db("insertDB");
    const haiku = database.collection("haiku");
    // create a document to insert
    const doc = {
      title: "Record of a Shriveled Datum",
      content: "No bytes, no problem. Just insert a document, in MongoDB",
    }
    const result = await haiku.insertOne(doc);

    console.log(`A document was inserted with the _id: ${result.insertedId}`);
  } finally {
    await client.close();
  }
}
run().catch(console.dir);

Поздний ответ, но может кому-то он понадобится в будущем

мы можем создать асинхронную функцию, которая будет возвращать нашу коллекцию и экземпляры db

      const dBInstances = async () => {
  const collection = await db
    .then((client) => {
      const db = client.db();
      const collection = db.collection("AGGREGATION");
      return { collection: collection, db: db };
    })
    .catch((err) => {
      console.log(`Data base instances error ${err}`);
    });

  return collection;
};

и после того, как мы можем использовать результат выполнения dBInstances () таким образом, я использовал деструктуризацию JS в примере ниже

      const test = async (req, res) => {
  const { collection, db } = await dBInstances();
  console.log(collection);
  console.log(db);
};

теперь мы разделили доступ к нашей базе данных и коллекции.

Другие вопросы по тегам