NodeJS 速習チュートリアル

Node.js MongoDB データ取得

1. データの検索

MongoDBでは、コレクション内のデータを検索するために find メソッドと findOne メソッドを使用します。
これは、MySQLデータベースにおいてテーブル内のデータを取得するために SELECT ステートメントを使用するのと同様の役割を果たします。

2. findOne メソッド

MongoDBのコレクションからデータを選択する際、findOne() メソッドを使用することができます。
findOne() メソッドは、選択条件に合致する最初のドキュメントのみを返します。

findOne() メソッドの第1引数はクエリ(Query)オブジェクトです。この例では空のクエリオブジェクト {} を使用しており、これはコレクション内のすべてのドキュメントを選択対象としますが、実際に返されるのは先頭の1件のみとなります。

2.1 実装例:「customers」コレクションから最初のドキュメントを取得する

let MongoClient = require('mongodb').MongoClient;
let url = "mongodb://localhost:27017/";

MongoClient.connect(url, function(err, db) {
  if (err) throw err;
  let dbo = db.db("mydb");
  
  // 空のクエリを指定して最初の1件を取得
  dbo.collection("customers").findOne({}, function(err, result) {
    if (err) throw err;
    console.log(result.name); // 取得したドキュメントの名前を表示
    db.close();
  });
});

上記のコードを demo_mongodb_findone.js というファイル名で保存し、実行してください。

demo_mongodb_findone.js の実行

C:\Users\Your Name>node demo_mongodb_findone.js

結果として、最初に挿入されたドキュメントの名前が表示されます。

Company Inc.

3. find メソッドによる全件取得

コレクション内のすべてのドキュメントを選択するには、find() メソッドを使用します。
find() メソッドは、選択条件に一致するすべてのドキュメントを返します。

第1引数のクエリオブジェクトに空のオブジェクト {} を指定すると、コレクション内の全ドキュメントが選択対象となります。引数なしで find() を呼び出した場合も、MySQLにおける SELECT * と同じ結果が得られます。

3.1 実装例:「customers」コレクションの全ドキュメントを取得する

let MongoClient = require('mongodb').MongoClient;
let url = "mongodb://localhost:27017/";

MongoClient.connect(url, function(err, db) {
  if (err) throw err;
  let dbo = db.db("mydb");
  
  // findで取得したカーソルをtoArrayでアレイに変換
  dbo.collection("customers").find({}).toArray(function(err, result) {
    if (err) throw err;
    console.log(result);
    db.close();
  });
});

demo_mongodb_find.js の実行

C:\Users\Your Name>node demo_mongodb_find.js

実行結果は以下のようになります。

[
  { _id: 58fdbf5c0ef8a50b4cdd9a84, name: 'John', address: 'Highway 71'},
  { _id: 58fdbf5c0ef8a50b4cdd9a85, name: 'Peter', address: 'Lowstreet 4'},
  // ... 全てのレコードがオブジェクト形式で出力されます
]

4. 特定のフィールドのみを取得する(プロジェクション)

find() メソッドの第2引数は プロジェクション(Projection) オブジェクトと呼ばれ、結果にどのフィールドを含める(または除外する)かを定義します。
この引数は任意であり、省略した場合はすべてのフィールドが結果に含まれます。

4.1 実装例:「name」と「address」のみを取得する

let MongoClient = require('mongodb').MongoClient;
let url = "mongodb://localhost:27017/";

MongoClient.connect(url, function(err, db) {
  if (err) throw err;
  let dbo = db.db("mydb");
  
  // projectionで表示したいフィールドに 1 を設定
  dbo.collection("customers").find({}, { projection: { _id: 0, name: 1, address: 1 } }).toArray(function(err, result) {
    if (err) throw err;
    console.log(result);
    db.close();
  });
});

       注意: 同じオブジェクト内で 0(非表示)と 1(表示)を混在させることはできません(_id フィールドは例外で、常にどちらとも併用可能です)。あるフィールドに 0 を指定すれば他のすべてのフィールドは 1 とみなされ、逆に 1 を指定すれば他はすべて 0 とみなされます。

4.2 実装例:特定のフィールドを除外する

以下の例では、結果から「address」フィールドのみを除外します。

dbo.collection("customers").find({}, { projection: { address: 0 } }).toArray(function(err, result) {
  if (err) throw err;
  console.log(result);
  db.close();
});

4.3 実装例:_id を除いて特定のフィールドのみ返す

_id フィールドを非表示にするには、明示的に 0 を設定する必要があります。

// nameフィールドのみを返し、_idを隠す
dbo.collection("customers").find({}, { projection: { _id: 0, name: 1 } }).toArray(function(err, result) {
  if (err) throw err;
  console.log(result);
  db.close();
});

4.4 エラーとなる例

前述の通り、_id 以外のフィールドで 01 を混在させるとエラーが発生します。

// これはエラーになります
dbo.collection("customers").find({}, { projection: { name: 1, address: 0 } }).toArray(function(err, result) {
  if (err) throw err;
  console.log(result);
  db.close();
});

5. 結果オブジェクトの処理

これまでの例で見てきた通り、find() の結果をアレイ(配列)に変換すると、各ドキュメントは一つのオブジェクトとして格納されます。

特定のドキュメントのデータにアクセスしたい場合は、アレイのインデックスとプロパティ名を参照するだけです。

5.1 実装例:3番目のドキュメントの住所を取得する

// 3番目のレコード(インデックス 2)の address プロパティを参照
console.log(result[2].address);

出力結果:

Apple st 652