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);
};
теперь мы разделили доступ к нашей базе данных и коллекции.