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


132

私は、MongoDBを使用してnodeJSでW3schoolsチュートリアルを試しています。

この例を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を使用していることにも注意してください。


次のことを確認しましたか?(1)データベースが実行されています(エラーが発生しなかったと思います)。(2)データベースmytestingdbが存在します(robomongo / robo3tを使用して接続にアクセスし、コレクションを表示してみてください)(3)コレクションの顧客が実際に存在します。また、そのスクリプトの呼び出し方法とNodejsのバージョン(インストール方法は?)も
お知らせください

データベースとコレクションが存在します(私はStudio 3tを使用してそれらにアクセスしました)。AJAX呼び出しを介してメソッドを呼び出すことによってnodeJSをデバッグしています。基本的にブレークポイントがヒットし、上記の例外が発生するまですべてが正常に機能します。NodeJSのバージョンはv6.11.4
Elie

次に、で始まるコードをdb.collection()...コンソールログに置き換えて、そこに到達するかどうかを確認します。問題ありません。
nbkhope 2017

データベースとコレクションが存在します(私はStudio 3tを使用してそれらにアクセスしました)。AJAX呼び出しを介してメソッドを呼び出すことによってnodeJSをデバッグしています。基本的にブレークポイントがヒットし、上記の例外が発生するまですべてが正常に機能します。NodeJSのバージョンはv6.11.4
Elie

回答:


80

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

これで問題は解決しました。バグのようですまたはドキュメントを更新する必要があります。


15
MikaSの回答を確認してください
hartmut

67
以前のバージョンへのダウングレードは、実際の解決策ではありません。これは、これを引き起こしたAPIの変更を気にしていないことを意味します
John Culviner

3
@JohnCulviner-これはタイミングの問題でした。怠惰の問題ではありません。この問題は、彼らが新しいアップデートをリリースしている最中に発生しました。私(および元のポスター)は明らかにこれを認識していませんでした。現時点では、ドキュメントはまだ更新されていません。彼らはすぐ後に更新されました。現在、これを解決しようとしている人は、MikaSのコメントに従って、更新されたドキュメントを確認する必要があります。ドキュメントが更新され、アップグレードされたバージョンを続行できるようになった後も、同じようにしました。
AyoO 2018

1
これに遭遇-私はこの問題に遭遇していて、 "mongodb:" "3.0.2"がpackage.jsonにインストールされていました。新しいバージョンに問題はありますか?
logos_164 2018年

4
まったく役に立たない。なぜ正解としてフラグが立てられるのですか?
CodingNow 2018

481

MongoDBネイティブNodeJSドライバーのバージョン3.0を使用している場合:

(これは、「mongodb」:「^ 3.0.0-rc0」、または最新バージョンの使用を継続したいpackage.json以降のバージョンを持つ人々に適用されます。

MongoDBネイティブNodeJSドライバーのバージョン2.xでは、データベースオブジェクトを接続コールバックへの引数として取得します。

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

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

このように書くvar db = client.db('mytestingdb');だけではなく、毎回これを()追加する必要がありMongoClient.connect('mongodb://localhost:27017/mytestingdb')ますか?私はいつも同じデータベースで作業しています。その余分な行を排除するためのアプローチはありますか?ちょっと時間のかかるものです。
ozgrozer 2017

7
@ozgrozerリクエストごとにdbに接続しているように聞こえます。それは悪い考えだと考えられています。あなたはそれについてここで読むことができます。一度だけ接続する場合、作成するアプリごとに新しい行が1つだけあります。
Mika Sundland

1
@MikaSああそう。私はあなたが言ったようにデータベースに接続していました。一度接続してdb変数を再利用できることを知りませんでした。どうもありがとうございます。
ozgrozer 2017

1
すばらしい答えです。これを理解するのは大変な時間でした
。RTFMを

私はそのようにクライアントを実装しましたが、\ node_modules \ mongodb \ lib \ gridfs-stream \ index.js:50:27
alex351

33

バージョン^ 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();
});

2
この回答はより新しいものであり、ドライバーのバージョン3に適用されます。ありがとう
Mohammad

1
私はこの解決策をお勧めします。将来の参照にはより適切です。
Jamie Nicholl-Shelley

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

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


この回答は、その長さと内容のため、低品質としてマークされています。詳細を入力してください。
Wahyu Kristianto

必要なだけです。この答えは私を助けました。
マヌエルヘルナンデス

1
@ManuelHernandezはそれが助けてくれてうれしい:)
ドレージャクソン

これは正しいansです。これを正しいansとしてマークしてください。
Ninad Kambli

12

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

7

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


5

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

 npm uninstall mongodb --save

 npm install mongodb@2.2.33 --save

ハッピーコーディング!


4

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

この質問は、シェルではなくノードドライバーに関連しています。
UpTheCreek 2018

2

誰かがまだこのエラーを解決する方法を試みている場合、私は以下のようにこれを行いました。

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

1

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

  db.collection("customers").find({}).toArray() 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.