ポイント: 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) }}
追加リソース
MongoDBガイド
- MongoDB概要:MongoDBの始め方
- UbuntuとMacにMongoDBをインストールする方法
- MongoDBでのデータベースの作成
- MongoDBシェル基本コマンド
- MongoDB Compass:Mongo GUIの使用
- MongoDBの役割ベースのアクセス制御(RBAC)について
- MongoDBの投影および投影演算子について
- MongoDBの集約関数について
- MongoDBのソート:sort()メソッドと例
- MongoDBでのPushとPull演算子の使用
- MongoDBの$unwindの使用方法
- 23の一般的なMongoDBクエリ演算子とその使用方法
- MongoDBのGeoLocationクエリの例
- MongoDBトランザクションの紹介
- MongoDBインデックス:主要なインデックスタイプとその管理方法
- 知っておくべき主要なMongoDBコマンド
- MongoDBレプリケーション:完全な紹介
- MongoDBクラスタの設定方法
- MongoDBシャーディング:概念、例、およびチュートリアル
- MongoDB Atlas:管理されたMongoDBの設定と使用
- MongoDBをDockerコンテナとして実行する方法
- MongoDBのメモリ使用量、管理、および要件
- MongoDBバックアップのためのmongodumpの使用方法
- MongoDBバックアップの復元のためのMongorestoreの例
- PyMongoの使用方法
- Mongooseを使用してMongoDBとNodeJSの使い方
- MongoDBチートシート
- MongoDB対Cassandra:NoSQLデータベースの比較
- PostgreSQL対MongoDB:データベースの比較
- MySQL対MongoDB:データベースの比較
- MongoDB認証の紹介
これらの投稿は私自身の意見であり、BMCの立場、戦略、または意見を必ずしも代表するものではありません。