Подтвердить что ты не робот

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

Я пробовал учебник W3schools на узлеJS с 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 для node JS (npm install mongodb), а версия MongoDB - MongoDB Enterprise 3.4.4 с драйвером MongoDB Node.js v3.0.0-RC0.

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

Для тех, кто хочет продолжить использование версии ^ 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();
});

Ответ 4

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

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

Ответ 5

В ответ на ответ @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.
}

Ответ 6

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

 npm uninstall mongodb --save

 npm install [email protected] --save

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

Ответ 7

У меня есть версия оболочки 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()");
 });

Ответ 8

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

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

Ответ 9

Я немного поэкспериментировал, чтобы посмотреть, смогу ли я сохранить имя базы данных как часть 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, где, по-видимому, новый драйвер будет использоваться по умолчанию, и вам больше не понадобится эта опция.