Mongooseを使用してMongoDBとNodeJSの使い方

Mongooseを使用してMongoDBとNodeJSの使い方

  • オーケストレーション
5分で読めます 更新日 Oct 27, 2017

ポイント: MongooseはMongoDBとの相互作用を簡素化し、データの保存とスキーマの検証を可能にするNodeJSライブラリです。このガイドでは、NodeJSのインストールを含む前提条件を詳細に説明し、データベースとスキーマを作成する手順、特に喫煙者データセットに焦点を当てたデータの読み込みに関するサンプルコードを提供します。

  • MongooseをMongoDBおよびNodeJSで使用する方法を学びます。
  • データの保存と検証のためのコード例を含みます。

ここでは、Mongooseを使用してMongoDBにデータを保存する方法を示します。

モongooseとは何ですか?

この例では、NodeJSを使用します。NodeJSを知らなくても心配しないでください。コードの各行を説明します。これはサーバーサイドのJavaScriptです。最初は少し理解するのが難しいですが、部分的には非同期であるため、マルチスレッドです。したがって、次のいずれかを使用する必要があります:

  • 同期関数のみ
  • コールバック

そうしないと、ステートメントnが実行されると、ステートメントn+1もすぐに実行されます。したがって、たとえば、ファイルを完全に読み込む前にテキストファイルを処理している可能性があります。

MongooseはAPIの上にあるAPIです。MongoDB NodeJS APIの使用を容易にします。

前提条件

まず、NodeJSのバージョン6以上が必要です。次に、このようにしてmongooseをインストールします:

    npm install mongoose

サンプルデータ

CDC(疾病管理予防センター)の喫煙者に関するデータを使用します。それをこのようにダウンロードします:

    wget https://chronicdata.cdc.gov/views/wsas-xwh5

このデータセットは喫煙者の調査です。私たちは、どの州に最も喫煙者がいるかを示すデータの部分(特定のcachedContents JSONセクション)のみを興味があります。そのセクションは次のようになります:

    {
"id" : 320867377,
"name" : "LocationDesc",
"dataTypeName" : "text",
"description" : "Location description",
"fieldName" : "locationdesc",
"position" : 3,
"renderTypeName" : "text",
"tableColumnId" : 20084901,
"width" : 109,
"cachedContents" : {
"largest" : "Wyoming",
"non_null" : 14069,
"null" : 0,
"top" : [ {
"item" : "North Carolina",
"count" : 20
}, {
"item" : "North Dakota",
"count" : 19
}, {
"item" : "Ohio",
"count" : 18

次に、mongoDB CLIを開いて、tobaccoデータベースとsmokersコレクションを作成します:

    mongo
use tobacco
db.createCollection("smokers")

以下でコードを説明します。最後には、コピーして貼り付けられるように全プログラムがあります。

まず、MongoDBに接続します:

    var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/tobacco', { useMongoClient: true });
mongoose.Promise = global.Promise;

次に、スキーマを作成します。スキーマは必須ではありません。MongoDBの一つの特徴は、あらゆる種類のJSONを格納できることです。しかし、スキーマを使用すると、自分の検証ルールを定義できます。スキーマには関数などのクールなアイテムを含めることもできます。

ご覧のとおり、cachedContentsは、私たちが興味のあるJSONドキュメントの部分です。そしてtopは配列です。

    var schema = new mongoose.Schema({
cachedContents : {
largest : String,
non_null : Number,
null : Number,
top : [{
item : String,
count : Number
}],
smallest : String,
format : {
displayStyle : String,
align : String
}
}
});

次に、スキーマを次のようにモデルにコンパイルします:

    var Smokers = mongoose.model('smokers', schema);

JSON文字列データ(fs.readFileSync)をJSON JavaScriptオブジェクトに読み込みます(JSON.parseを使用)。次のコードセクションが読み込みが完了するまで待つように、fs.readFileSync(すなわち、同期)を使用していることに注意してください。

    fs = require('fs');
    var d = fs.readFileSync('/home/walker/Documents/mongodb/tobacco.json', 'utf8', (err, data) => {
if (err) throw err;
return (d); });
    var e = JSON.parse(d);

次は最も複雑な部分です。tobacco JSONファイルは2層のJSONです。したがって、ループの中にループがあります。次に、e.columns[i,j].cachedContentsを使用してJSONオブジェクトのcachedContents部分を参照します。私たちはe.columns[i,j].cachedContents.topを持つレコードのみを望んでいます。すなわち、topが定義されています。(他のものは地理的位置データです。)

e.columns[i,j].cachedContentsをSmokersスキーマのコンストラクタに供給します。そして、saveメソッドを使用します。Saveは非同期で実行されます。しかし、プログラムの最後に来るので、それは気にしません。

    for (i in e) {
for (j in i) {
    if (e.columns[i,j].dataTypeName != 'location') {
if (typeof(e.columns[i,j].cachedContents.top) != 'undefined') {
var smokers = new Smokers(e.columns[i,j].cachedContents);
console.log(e.columns[i,j].cachedContents);
smokers.save(function (err) {
if (err)return console.log(err);
})
}
}
}
}

完全なコード

これをloaddata.jsとしてコピーして保存します。次に、次のように実行します:node loaddata.js。mainやそのようなものはありません。単に上から下へと実行されます。

    fs = require('fs');
    var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/tobacco', { useMongoClient: true });
mongoose.Promise = global.Promise;
    var schema = new mongoose.Schema({
cachedContents : {
largest : String,
non_null : Number,
null : Number,
top : [{
item : String,
count : Number
}],
smallest : String,
format : {
displayStyle : String,
align : String
}
}
});
    var d = fs.readFileSync('/home/walker/Documents/mongodb/tobacco.json', 'utf8', (err, data) => {
if (err) throw err;
return (d); });
    var e = JSON.parse(d);
    var Smokers = mongoose.model('smokers', schema);
    for (i in e) {
for (j in i) {
    if (e.columns[i,j].dataTypeName != 'location') {
if (typeof(e.columns[i,j].cachedContents.top) != 'undefined') {
var smokers = new Smokers(e.columns[i,j].cachedContents);
console.log(e.columns[i,j].cachedContents);
smokers.save(function (err) {
if (err)return console.log(err);
})
}
}
}
}

保存されたレコードは次のようになります:

    { largest: 'Wyoming',
non_null: 14069,
null: 0,
top:
[ { item: 'North Carolina', count: 20 },
{ item: 'North Dakota', count: 19 },
{ item: 'Ohio', count: 18 },
{ item: 'Oklahoma', count: 17 },
{ item: 'Oregon', count: 16 },
{ item: 'Pennsylvania', count: 15 },
{ item: 'Puerto Rico', count: 14 },
{ item: 'Rhode Island', count: 13 },
{ item: 'South Carolina', count: 12 },
{ item: 'South Dakota', count: 11 },
{ item: 'Tennessee', count: 10 },
{ item: 'Texas', count: 9 },
{ item: 'Utah', count: 8 },
{ item: 'Vermont', count: 7 },
{ item: 'Virginia', count: 6 },
{ item: 'Washington', count: 5 },
{ item: 'West Virginia', count: 4 },
{ item: 'Wisconsin', count: 3 },
{ item: 'Wyoming', count: 2 },
{ item: 'Indiana', count: 1 } ],
smallest: 'Alabama' }

ヒント

これを使用しているときに、以下のようにオブジェクトを削除して表示できます。Removeにはフィルタが必要です。{}はすべてのレコードを意味するフィルタです。tobaccoの代わりにdbを使用してデータベースを示します。そしてsmokersがコレクションです。何かを間違ってスペルすると、エラーは表示されず、新しいオブジェクトを作成したいと仮定します。(JavaScriptもそうで、変数名のスペルに関してエラーチェックがありません。)

    sse tobacco
db.smokers.remove({})
db.smokers.find({}).pretty()

その後、インタラクティブなノードインタープリタを使用して、次のようにデータをステップスルーできます(つまり、ノードを実行し、研究したい任意のコードを貼り付けます):

    for (i in e) { for (j in i) {"i=",i,"j=",j,console.log(e.columns[i,j].cachedContents) }}

追加リソース

play

これらの投稿は私自身の意見であり、BMCの立場、戦略、または意見を必ずしも代表するものではありません。

オーケストレーションの関連記事

The Briefを購読する

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ありがとう

あなたはThe Briefに登録されました
The Briefはメインフレームとエンタープライズオーケストレーション—BMC AMIとControl-M—および、両者に関するアナリストの研究、顧客の展開、イベントをカバーしています。