在使用 MongoClient v3.0时,db.Collection 不是一个函数

我一直在用 MongoDB 在 nodeJS 上尝试 W3学校辅导

当我尝试在 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) {}

另外,请注意(如果有必要的话) ,我已经为节点 JS (Npm install mongodb)安装了最新的 MongoDB 包,MongoDB 版本是 MongoDB Enterprise 3.4.4,带有 MongoDB Node.JS 驱动程序 v3.0.0-rc0。

182944 次浏览

我也遇到了同样的情况。在 package.json 中,将 mongodb 行更改为“ mongodb”: “ ^ 2.2.33”。您需要通过删除 MongoDB Driver/node _ module 等来卸载 MongoDB npm,然后安装 npm 来安装这个版本。

这解决了我的问题。似乎是一个错误或文件需要更新。

对于使用 MongoDB 原生 NodeJS 驱动程序3.0版本的用户:

(这适用于使用“ mongodb”: “ ^ 3.0.0-rc0”或 package.json 中的更高版本的用户,他们希望继续使用最新版本。)

MongoDB 本地 NodeJS 驱动程序的2.x 版本中,您将获得数据库对象作为 connect 回调的参数:

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

根据 更改日志 for 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.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();
});

我通过运行这些代码很容易地解决了这个问题:

 npm uninstall mongodb --save


npm install mongodb@2.2.33 --save

编码愉快!

Piggy 支持@MikkaS 对 Mongo Client v3.x 的回答,我只需要一个异步/等待格式,看起来稍微修改如下:

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

我有 MongoDB shell 版本3.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()");
});
MongoClient.connect(url (err, client) => {
if(err) throw err;


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


database.collection('name').find()
.toArray((err, results) => {
if(err) throw err;


results.forEach((value)=>{
console.log(value.name);
});
})
})

代码的唯一问题是您正在访问保存数据库处理程序的对象。必须直接访问数据库(参见上面的数据库变量)。这段代码将以数组的形式返回您的数据库,然后循环遍历该数据库并记录数据库中每个人的名称。

MongoDB 查询将光标返回到存储在内存中的数组。要访问该数组的结果,必须在查询结束时调用 .toArray()

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

我做了一些实验,看看我是否可以保持数据库名称作为网址的一部分。我更喜欢承诺语法,但它应该仍然适用于回调语法。下面注意,调用 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出来之前使用这个选项是明智的,因为新的驱动程序可能是默认的,您不再需要这个选项了。

如果有人还在尝试解决这个错误,我已经像下面这样做了。

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

它曾经与旧版本的 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();
});
});

迟到的回答,但也许将来有人会需要它

我们可以创建一个异步函数,它将返回我们的集合和 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);
};

现在我们可以分开访问数据库和收集了。

最近我也遇到了同样的问题,我最终使用 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);