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。
私は同じことに遭遇しました。 package.jsonで、mongodbの行を "mongodb": "^ 2.2.33"に変更します。 mongodbをnpmアンインストールする必要があります。その後npm installしてこのバージョンをインストールします。
これで問題は解決しました。バグと思われるか、ドキュメントを更新する必要があります。
(これは "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();
});
});
バージョン^ 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();
});
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);
});
})
})
コードの唯一の問題は、データベースを保持しているオブジェクトにアクセスしていることです。データベースに直接アクセスする必要があります(上記のデータベース変数を参照)。このコードはデータベースを配列で返してからそれをループし、データベース内の全員の名前を記録します。
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.
}
私はこれらのコードを実行することによってそれを簡単に解決しました:
npm uninstall mongodb --save
npm install [email protected] --save
ハッピーコーディング!
私は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()");
});
データベース名を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では、おそらく新しいドライバーがデフォルトになり、オプションはもう必要なくなります。
MongoDBクエリは、メモリに格納されている配列にカーソルを返します。その配列の結果にアクセスするには、クエリの最後で.toArray()
を呼び出す必要があります。
db.collection("customers").find({}).toArray()