[NeDBを使い方]データベースの検索結果をプロジェクションしよう。

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

NeDBはJavaScriptで作られたデータベースです。 Node.js、nw.js、エレクトロン、ブラウザ等で動かすことができます。 Github NeDBはドキュメント型データベースでJSONをそのまま保存できます。 そのため、JavaScriptのプログラムと親和性が高く、データの取得、利用が簡単にできます。 また、NeDBはMongoDBと互換性があり、一つのデータベースはMongoDBのコレクションと対応しています。 対応は下記の通りです。 – データベース→コレクション – データロウ→ドキュメント 今回は、NeDBデータベースの検索結果をプロジェクションする方法について書いていきます。

テスト用のデータベース

本記事で使うカウント対象のデータベースとドキュメントをインサートして準備します。 記事内で検索条件指定で得られたドキュメントを説明のために、_idフィールドの値を使います。 例:〇〇という検索条件ため、結果はid1,id2,id3のドキュメントの配列になります。
export function getTestDatabase() {
let db = new Datastore();
db.insert([
{ _id: 'id1', planet: 'Mars', system: 'solar', inhabited: false },
{ _id: 'id2', planet: 'Earth', system: 'solar', inhabited: true },
{ _id: 'id3', planet: 'Jupiter', system: 'solar', inhabited: false },
{ _id: 'id4', planet: 'Omicron Persia 8', system: 'futurama', inhabited: true },
], function (err, newDoc) {
console.log('err', err);
console.log('newDoc', newDoc);
})
return db
}

ドキュメントの検索結果をプロジェクションする

findとfindOneはオプションとして第二引数を持ちます。この引数を指定することで検索結果をプロジェクションすることができます。 MongoDBと同じ構文で下記のようになります。
  • 包含モード{ a: 1, b: 1 }:検索結果のドキュメントはaフィールドとbフィールドを包含したドキュメントになります。(*_idフィールドについては後述)
  • 除外モード{ a: 0, b: 0 }:検索結果のドキュメントはaフィールドとbフィールドを除外ドキュメントになります。(*_idフィールドについては後述)
上記の二つのモードは併用することができません。(*_idフィールドについては後述) _idは特別なフィールドです、デフォルトで_idフィールドはドキュメントに含まれますが、明示的に設定することで除外することが可能です。また、モードの併用制限から除外されています。 ネストされたドキュメントもプロジェクションすることができます。
export function findDataWithhProjection(){
let db = getTestDatabase()
// 第二引数を指定して検索結果のドキュメントに包含モードを適用します。
db.find({ planet: 'Mars' }, { planet: 1, system: 1 }, function (err, docs) {
// コレクション内のドキュメントでplanetが'Mars'のドキュメントをplanet,system,_idのフィールドを包含したドキュメントを取得します。
console.log('err', err);
console.log('docs', docs);
});

// 第二引数を指定して検索結果のドキュメントに包含モードを適用します。明示的に_idフィールドを除外するように設定します。
db.find({ planet: 'Mars' }, { planet: 1, system: 1, _id: 0 }, function (err, docs) {
// コレクション内のドキュメントでplanetが'Mars'のドキュメントをplanet,systemのフィールドを包含したドキュメントを取得します。
console.log('err', err);
console.log('docs', docs);
});

// 第二引数を指定して検索結果のドキュメントに除外モードを適用します。
db.find({ planet: 'Mars' }, { planet: 0, system: 0, _id: 0 }, function (err, docs) {
// コレクション内のドキュメントでplanetが'Mars'のドキュメントをplanet,systemのフィールドを除外したドキュメントを取得します。
console.log('err', err);
console.log('docs', docs);
});

// 第二引数を指定して検索結果のドキュメントに包含モードと除外モードを適用します。
db.find({ planet: 'Mars' }, { planet: 0, system: 1 }, function (err, docs) {
// モードの併用はできないため、errにはエラーメッセージ、docsはundefineになります。
console.log('err', err);
console.log('docs', docs);
});

// Cursorオブジェクトにも同様にプロジェクションを適用できます。しかし、この構文はMongoDBと互換性がありません。
db.find({ planet: 'Mars' }).projection({ planet: 1, system: 1 }).exec(function (err, docs) {
// コレクション内のドキュメントでplanetが'Mars'のドキュメントをplanet,system,_idのフィールドを包含したドキュメントを取得します。
console.log('err', err);
console.log('docs', docs);
});

// プロジェクションはネストドキュメントにも適用できます。
db.findOne({ planet: 'Earth' }).projection({ planet: 1, 'humans.genders': 1 }).exec(function (err, doc) {
// コレクション内のドキュメントでplanetが'Earth'のドキュメントをplanet,system,_id,humans,humans.gendersのフィールドを包含したドキュメントを取得します。
console.log('err', err);
console.log('doc', doc);
});
}