web-dev-qa-db-ja.com

mongoClient v3.0を使用する場合、db.collectionは関数ではありません

W3schools tutorial MongoDBを使用したnodeJSで試してみました。

この例を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用の最新のMongoDBパッケージ( npm install mongodb )をインストールし、MongoDBのバージョンはMongoDB Enterprise 3.4.4で、MongoDB Node.jsドライバーv3を使用しています。 0.0 − rc0。

99
Elie Asmar

私は同じことに遭遇しました。 package.jsonで、mongodbの行を "mongodb": "^ 2.2.33"に変更します。 mongodbをnpmアンインストールする必要があります。その後npm installしてこのバージョンをインストールします。

これで問題は解決しました。バグと思われるか、ドキュメントを更新する必要があります。

67
AyoO

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

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

バージョン^ 3.0.1を使い続けたい場合は、MongoClient.connect()メソッドの使い方の変更点に注意してください。コールバックはdbを返さず、代わりにclientを返します。これに対して、探しているdbインスタンスを取得するために呼び出す必要があるdb(dbname)という関数があります。

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

コードの唯一の問題は、データベースを保持しているオブジェクトにアクセスしていることです。データベースに直接アクセスする必要があります(上記のデータベース変数を参照)。このコードはデータベースを配列で返してからそれをループし、データベース内の全員の名前を記録します。

11
Dre Jackson

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

私はこれらのコードを実行することによってそれを簡単に解決しました:

 npm uninstall mongodb --save

 npm install [email protected] --save

ハッピーコーディング!

5
Saurabh Singh

私はMongoDBシェルのバージョンv3.6.4を持っています。

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()");
 });
2
Gianluca Mazzeo

データベース名を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が出るまではこの時点で使用するのが賢明です。バージョン4では、おそらく新しいドライバーがデフォルトになり、オプションはもう必要なくなります。

1
pwilcox

MongoDBクエリは、メモリに格納されている配列にカーソルを返します。その配列の結果にアクセスするには、クエリの最後で.toArray()を呼び出す必要があります。

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