使用MongoClient v3.0时,db.collection不是函数

时间:2017-12-05 20:34:25

标签: node.js mongodb

我一直在使用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。

12 个答案:

答案 0 :(得分:379)

对于MongoDB本机NodeJS驱动程序3.0版本的人员:

(这适用于那些想要继续使用最新版本的“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)

我遇到了同样的事情。在package.json中,将mongodb行更改为“mongodb”:“^ 2.2.33”。你需要npm卸载mongodb;然后npm install安装此版本。

这解决了我的问题。似乎是一个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);
};

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