mongose再認識(一)
mongoose
はODM(Object Data Model)のライブラリであり、オブジェクトデータモデルとも呼ばれる.では、なぜ
と言うのでしょうか.注意:MongoDBまたはMongoは、NoSQLタイプのデータベース、つまり非リレーショナルタイプのデータベースです.
データを処理し、オブジェクト間の変換を実現するために使用されます.
分からなかったり、知っているようで分からなかったりしたら、次の文を読んだら、きっとわかると思います.
よく使われる用語
Collections
Mongoの
Collections
はリレーショナル・データベースのテーブルに相当し、JSONドキュメント(document)が大量に含まれています.Documents
Documents
はSQLの
(records)または
(rows)に相当します.SQLでは複数のテーブルを使用し、データ間の参照によってデータ間の関連を表現する必要がありますが、MongoではDocument
で実現できます.Schema
SQL定義
schema
はテーブルの定義を通りますが、MongoDBにはこれがありません.MongoDBを使用して直接挿入した場合はdocument
です.mongoseは、schema
のデータ構造または構造関数を表すためにdocument
を定義し、アプリケーションレベルで構築され、各docuemntはその例示的なオブジェクトである.Fields
Fields
または属性と呼ばれ、SQLの
(columns)に相当し、schema
を形成するために使用されます.Models
Schema
と同様にデータ構造または構造関数ですが、より特殊です.schema
を使用して、SQLのDocument
(record)に相当する
のインスタンスを作成します.mongoseのSchemaとModel
mongoseの
schema
はdocument
の構造関数であり、document
のデフォルト値を定義してフィールド(fields)の検証を行うことができます.mongoseの
model
は、document
(レコードとも呼ばれる)に対するCRUD(増加、調査、変更、削除)を実現するデータにアクセスするインタフェースを提供している.したがって,
model
はSchema
のパッケージであり,パッケージによりSchema
構造のデータとMongoDBデータベースとの相互作用を実現しているといえる.注:開発の過程では、
Model
とSchema
の例が使用されているので、文章の冒頭で述べた
と
が理解できます.具体的には、以下のサンプルコードを参照してください.mongoseを引用
使用前に
mongooe
をインストールする必要があります.yarn install mongoose
でインストールし、次のコードで参照してください.// mongoose
let mongoose = require('mongoose')
説明:
Schema
とModel
は明示的にデータベースに接続されていないのに、なぜそう言うのか.開発の過程で、使用されたmongoose.connect("mongodb://127.0.0.1:27017")
が返すオブジェクトで作成されたSchema
とModel
ではなく、直接使用されたmongoose
の参照であるため、このようなメリットは明らかであり、性能が大幅に向上した.mongose定義は単一の設計モードを使用するため、
require
を使用して単一のオブジェクトを返します.これは開発でよく見られ、自分のライブラリを書くのに指導的な意味があります.MongoDBデータベースへの接続
// mongoose
let mongoose = require('mongoose')
// demo
mongoose.connect('mongodb://127.0.0.1:27017/demo')
Schemaの定義
各
collection
のすべてのdocument
は、同じSchema
によって定義されたfield
を使用する.各document
オブジェクトのキー名は、Schema
によって定義される.// mongoose
let mongoose = require('mongoose')
// demo
mongoose.connect('mongodb://127.0.0.1:27017/demo')
// Schema
let userSchema = new mongoose.Schema({
firstname: String,
lastname: String
})
Schema
においても、field
がfirstname
タイプであるなど、String
について検証することができる.Schema
のフィールド値は、Array、String、Boolean、Buffer、Date、Number、ObjectId、またはMixed(汎用、または可変データ型)であってもよい.モデルを定義してインスタンス化
// mongoose
let mongoose = require('mongoose')
// demo
mongoose.connect('mongodb://127.0.0.1:27017/demo')
// Schema
let UserSchema = new mongoose.Schema({
firstname: String,
lastname: String
})
// Model
let UserModel = mongoose.model('User', userSchema)
// Model
let person = new Usermodel({
firstname: ' ',
lastname: ' '
})
なぜSchemaの定義とインスタンス化を一緒に置くことができ、Modelの定義とインスタンス化を分けるのか疑問に思う人もいるかもしれません.
schema
の例は特定の動作に関与しないため、Model
の例は複雑な動作に関与することが多い.だから前者は開発の中で往々にして2つのステップを一緒にして、後者は別々にします.mongoseのCRUD
データの追加
person
.save()
.then(doc => {
console.log(doc)
})
.catch(err => {
console.error(err)
})
データの表示
UserModel
.find({
lastname: ' ' // query
})
.then(doc => {
console.log(doc)
})
.catch(err => {
console.error(err)
})
データの更新
UserModel
.findOneAndUpdate(
{
lasttname: ' ' // query
},
{
firstname: 'xxx' // field:values
},
{
new: true, // document
runValidators: true //
})
.then(doc => {
console.log(doc)
})
.catch(err => {
console.error(err)
})
データの削除
UserModel
.findOneAndRemove({
firstname: ' '
})
.then(response => {
console.log(response)
})
.catch(err => {
console.error(err)
})
もちろんmongoseは実用的なapiもたくさん提供していますが、ここではあまり言いません.mongoose queries
mongoseシリーズ記事