我一直在使用MongoDB在nodeJS上尝试W3schools tutorial。
当我尝试在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节点.js驱动程序v3.0.0-rc0。
答案 0 :(得分:379)
(这适用于那些想要继续使用最新版本的“mongodb”:“^ 3.0.0-rc0”或package.json中的更高版本。)
在MongoDB native NodeJS driver的2.x版本中,您将获取数据库对象作为连接回调的参数:
MongoClient.connect('mongodb://localhost:27017/mytestingdb', (err, db) => {
// Database returned
});
根据changelog 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();
});
});
答案 1 :(得分:68)
这解决了我的问题。似乎是一个bug或文档需要更新。
答案 2 :(得分:26)
对于那些想要继续使用版本^ 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();
});
答案 3 :(得分:13)
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);
});
})
})
您的代码唯一的问题是您正在访问持有数据库的对象。您必须直接访问数据库(请参阅上面的数据库变量)。此代码将在数组中返回您的数据库,然后循环遍历它并为数据库中的每个人记录名称。
答案 4 :(得分:11)
对于Mongo Client v3.x的@MikkaS回答的小猪支持,我只需要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.
}
答案 5 :(得分:5)
我通过运行这些代码轻松解决了这个问题:
npm uninstall mongodb --save
npm install mongodb@2.2.33 --save
快乐的编码!
答案 6 :(得分:4)
如果有人仍在尝试解决此错误,我将按照以下步骤进行操作。
{ "error": {
"statusCode": 500,
"name": "error",
"message": "column \"id\" does not exist",
"length": 164,
"severity": "ERROR",
"code": "42703",
"position": "8",
"file": "d:\\pginstaller_12.auto\\postgres.windows-x64\\src\\backend\\parser\\parse_relation.c",
"line": "3359",
"routine": "errorMissingColumn",
"stack": "error: column \"id\" does not exist\n at Connection.parseE (D:\\Users\\Yesha.Bhatt\\Documents\\authpractise\\node_modules\\pg\\lib\\connection.js:614:13)\n at Connection.parseMessage (D:\\Users\\Yesha.Bhatt\\Documents\\authpractise\\node_modules\\pg\\lib\\connection.js:413:19)\n at Socket.<anonymous> (D:\\Users\\Yesha.Bhatt\\Documents\\authpractise\\node_modules\\pg\\lib\\connection.js:129:22)\n at Socket.emit (events.js:311:20)\n at addChunk (_stream_readable.js:294:12)\n at readableAddChunk (_stream_readable.js:275:11)\n at Socket.Readable.push (_stream_readable.js:209:10)\n at TCP.onStreamRead (internal/stream_base_commons.js:186:23)" } }
答案 7 :(得分:2)
我有MongoDB shell版本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 :(得分:1)
MongoDB查询将游标返回到存储在内存中的数组。要访问该数组的结果,必须在查询结束时调用.toArray()
。
db.collection("customers").find({}).toArray()
答案 9 :(得分:1)
它曾经与 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();
});
});
答案 10 :(得分:0)
我做了一些实验,以查看是否可以将数据库名称保留为url的一部分。我更喜欢promise语法,但它仍应适用于回调语法。请注意,在下面,将在不传递任何参数的情况下调用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版,因为新的驱动程序可能是默认的,而您将不再需要该选项。
答案 11 :(得分:0)
迟到的答案,但也许将来会有人需要它
我们可以创建一个异步函数来返回我们的集合和数据库实例
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);
};
现在我们可以分开访问我们的数据库和集合。