【Nodejs】mongodbデータベースを操作する

ここに画像の説明を挿入

1 はじめに


  • Mongoose は、Node 経由で MongoDB を操作できるようにするモジュールです。
  • Mongoose はオブジェクト ドキュメント モデル (ODM) ライブラリであり、Node のネイティブ MongoDB モジュールをさらに最適化してカプセル化し、より多くの機能を提供します。ほとんどの場合、構造化スキーマを MongoDB コレクションに適用するために使用され、検証や型変換などの利点が得られます。
  • マングースのオブジェクト:
    • スキーマ モード オブジェクト (スキーマ オブジェクト定義はデータベース内の文書構造を制約します)
    • Model モデル オブジェクト (Model オブジェクトはコレクション内のすべてのドキュメントの表現として使用され、MongoDB データベースのコレクション コレクションに相当します)
    • Document ドキュメント オブジェクト (Document はコレクション内の特定のドキュメントを表し、コレクション内の特定のドキュメントと同等です)

マングースの利点

  • ドキュメントのスキーマ構造(Schema)を作成できます。
  • 検証はモデル内のオブジェクト/ドキュメントに対して実行できます。
  • データは型キャストによってオブジェクト モデルに変換できます
  • ミドルウェアを使用してビジネス ロジック フックを適用できる
  • ノードのネイティブ MongoDB ドライバーよりも簡単

インストール

npm i -S mongoose

2. データベースに接続します


config/db.config.js

// 1.引入mongoose
const mongoose = require("mongoose");

// 2.连接mongodb数据库
// 指定连接数据库后不需要存在,当你插入第一条数据库后会自动创建数据库
/*
mongoose.connect('mongodb://数据库地址:端口号/数据库名',{useMongoClient:true})
如果端口号是默认端口号(27017)则可以省略不写
*/
mongoose.connect('mongodb://127.0.0.1:27017/ds2', {
    
    
  useNewUrlParser: true,
  useUnifiedTopology: true,
  useCreateIndex: true,
})

// 3.监听mongodb数据库的连接状态
// 绑定数据库连接成功事件
mongoose.connection.once("open", function () {
    
    
    console.log("连接成功");
});
// 绑定数据库连接失败事件
mongoose.connection.once("close", function () {
    
    
    console.log("数据库连接已经断开");
});

// 4.断开数据库连接(一般不用)
mongooes.disconnect();

注: MongoDB データベースは、通常の状況では 1 回接続するだけで済みます。一度接続した後は、プロジェクトが停止してサーバーが閉じない限り、通常、接続は切断されません

bin ディレクトリの www ファイルで直接 require(".../config/db.config.js") を使用して、データベース接続を開始します。
ここに画像の説明を挿入

3. スキーマ オブジェクトとモデル オブジェクトを作成する


データベース内のスキーマは、データベース オブジェクトのコレクションです。スキーマは mongoose で使用されるデータ モードであり、テーブル構造の定義として理解できます。各スキーマは mongodb のコレクションにマップされますが、データベースを操作する機能はありません。

  • 各スキーマは MongoDB コレクションにマップされ、このコレクション内のドキュメント構造を定義します。
  • サポートされているフィールドの種類
タイプ 効果
文字列を定義する
番号 数値を定義する
日にち 日付を定義する
バッファ バイナリを定義する
ブール値 ブール値を定義する
混合 ハイブリッド タイプを定義する
オブジェクトID オブジェクトIDを定義する
配列 配列を定義する

model/UserModel.js

const mongoose = require("mongoose")
const Schema=mongooes.Schema;
//创建模式对象
const UserType=new Schema({
    
    
    name:{
    
    
           type: 'string',
           //添加约束,保证数据的完整性,让数据按规矩统一
           require: true
        },
    age:Number,
    gender:{
    
    
        type:String,
        // 默认值
        default:'female'
    },
    address:String
})

//创建模型对象
//通过Schema来创建Model
//Model代表的是数据库中的集合,通过Model才能对数据库进行操作
//mongoose.model(modelName,schema)
//建立映射关系,students是集合,mongoose会自动将集合变成复数比如student会变成students
//大写也会被自动转换为小写,比如Users会变成users
const UserModel=mongoose.model("UserModel",UserType,"user"); 
//第一个参数表示创建的集合的名称,第二个参数表示利用的模式对象,第三个参数是强行指定集合名称

module.exports  = UserModel 

4. ドキュメントの追加


4.1 保存()

操作はドキュメント
の場合です。

var mongoose = require('mongoose')
const UserModel = require('../model/UserModel');

//链式调用 通过new 一个Model创建一个 document
new UserModel({
    
    name:"小明",age:18}).save((err,docs) => {
    
    
    if(!err){
    
    
        console.log(docs)
        res.send({
    
    
          code: 200,
          data: {
    
    
            id: docs._id,
          },
        })
        //{ _id: 6017bd1cf4cc8544d8ed2a8a, name: '小明', age: 18, __v: 0 }
    }
})   

4.2 作成()

  • オペレーティングモデル
  • Model.create(doc(s), [callback])
  • パラメータ:
    [doc(s)]: ドキュメント オブジェクトまたはドキュメント オブジェクトの配列
    [callback]: コールバック関数
var mongoose = require('mongoose')
const UserModel = require('../model/UserModel');

UserModel.create({
    
    name:"小明",age:18},{
    
    name:"小红",age:10},(err,doc1,doc2) => {
    
    
   if(!err){
    
    
        console.log(doc1)
        //{ _id: 6017be2d77c8dd01242624bb, name: '小明', age: 18, __v: 0 }
        console.log(doc2)
        //{ _id: 6017be2d77c8dd01242624bc, name: '小红', age: 10, __v: 0 }
    }
})

他の:

//Model.createOne(doc, [callback]);		创建一个对象
//Model.createMany(doc, [callback]);		创建多个对象
//	-doc是需要插入的文档
//	-callback(err) 是回调函数,可以用来提示是否创建成功了
4.3 insertMany()
Model.insertMany(doc(s), [options], [callback])
返回值为一个数组
案例:
UserModel.insertMany({
    
    name:"小明",age:18},{
    
    name:"小芳",age:14},(err,docs) => {
    
    
   if(!err){
    
    
        console.log(docs)
        /*[{ _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 },
           { _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 }]*/
    }
})

5. 文書クエリ


_id 名前 成績 __v
6017befb5c36d64d08b72576 シャオ・ミン 68 0
6017befb5c36d64d08b72577 小芳 94 0
6017c455ba09d355a49ec8eb 少し赤 52 0
6017c455ba09d355a49ec8ec シャオ・ガン 46 0

5.1 find()

  • Model.find(conditions, [projection], [options], [callback])

  • パラメータ

    • 条件: クエリ条件
    • [プロジェクション]: コントロールリターンフィールド
    • [オプション]: クエリパラメータを設定します
    • [コールバック]: コールバック関数 – function(err,docs){}
  • 場合:

var mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student',(err) => {
    
    
    if(!err){
    
    
        var schema = new mongoose.Schema({
    
    name:String,grades:Number})
        var stuModel = mongoose.model('grades',schema)
        //查询所有数据
        stuModel.find((err,docs) => {
    
    
           if(!err){
    
    
            	console.log(docs)
        	}
        })        
       /* [{ _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 },
           { _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 },
           { _id: 6017c455ba09d355a49ec8eb, name: '小红', grades: 52, __v: 0 },
           { _id: 6017c455ba09d355a49ec8ec, name: '小刚', grades: 46, __v: 0 }]*/
        
        //查询成绩大于60以上的数据
        stuModel.find({
    
    grades:{
    
    $gte:60}},(err,docs) => {
    
    
            if(!err){
    
    
                 console.log(docs)
             }
         })
        /*[{ _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 },
           { _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 }]*/
        
        //查询成绩大于60以上且名字里存在‘芳’的数据
        stuModel.find({
    
    name://,grades:{
    
    $gte:60}},(err,docs) => {
    
    
            if(!err){
    
    
                 console.log(docs)
             }
         })
        /*[
        *     { _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 }
        * ]*/
        
        //查询名字里存在‘明’的数据且只输出‘name’字段
        //_id默认会返回
        stuModel.find({
    
    name://},{
    
    name:1,_id:0},(err,docs) => {
    
    
            if(!err){
    
    
                 console.log(docs)
             }
         })
        // [{name: '小明'}]
        
        //跳过前两条数据并限制只输出一条数据
        stuModel.find(null,null,{
    
    skip:2,limit: 1},(err,docs) => {
    
    
            if(!err){
    
    
                 console.log(docs)
             }
         })
        /*[{ _id: 6017c455ba09d355a49ec8eb, name: '小红', grades: 52, __v: 0 }*/
    }
})

5.2 findById()

  • Model.findById(id, [projection], [options], [callback])
  • 場合:
var mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student',(err) => {
    
    
    if(!err){
    
    
        var schema = new mongoose.Schema({
    
    name:String,grades:Number})
        var stuModel = mongoose.model('grades',schema)
        //保存查询数据的_id
        var aIDArr = []
        
        //查询所有数据
        stuModel.find((err,docs) => {
    
    
           if(!err){
    
    
            	docs.forEach((item,index,arr)=>{
    
    
                    aIDArr.push(item._id)
                })
                //显示第 0 个元素的所有字段
                stuModel.findById(aIDArr[0],(err,doc)=>{
    
    
                    if(!err){
    
    
                        console.log(doc)
                    }
                })
               // { _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 }
               
                //显示第 0 个元素且只输出name字段
                stuModel.findById(aIDArr[0],{
    
    name:1,_id:0},(err,doc)=>{
    
    
                    if(!err){
    
    
                        console.log(doc)
                    }
                })
               // { name: '小明' }
               
                //显示第 0 个元素且输出最少的字段(_id默认输出)
                stuModel.findById(aIDArr[0],{
    
    lean:true},(err,doc)=>{
    
    
                    if(!err){
    
    
                        console.log(doc)
                    }
                })
               // { _id: 6017befb5c36d64d08b72576 }
        	}
        })
    }
})

5.3 findOne()

  • クエリされたデータの最初のデータを返します
  • Model.findOne([conditions], [projection], [options], [callback])
  • 場合:
var mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student',(err) => {
    
    
    if(!err){
    
    
        var schema = new mongoose.Schema({
    
    name:String,grades:Number})
        var stuModel = mongoose.model('grades',schema)
        //找出age>80的文档中的第一个文档
        stuModel.findOne({
    
    grades:{
    
    $gt:80}},(err,doc) => {
    
    
           if(!err){
    
    
            	console.log(doc)
        	}
        })
        //{ _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 }

        //找出age>80的文档中的第一个文档,且只输出name字段
        stuModel.findOne({
    
    grades:{
    
    $gt:80}},{
    
    name:1,_id:0},(err,doc) => {
    
    
            if(!err){
    
    
                 console.log(doc)
             }
         })
         //{ name: '小芳' }

        //找出age>80的文档中的第一个文档,且输出包含name字段在内的最短字段
        stuModel.findOne({
    
    grades:{
    
    $gt:80}},{
    
    lern:true},(err,doc) => {
    
    
            if(!err){
    
    
                 console.log(doc)
             }
         })
         //{ _id: 6017befb5c36d64d08b72577 }
    }
})

5.4 複雑なクエリ【$where】

  • $where は、クエリの一部として任意の JavaScript、JavaScript 式または関数を含む文字列を使用できます。
  • ケース
var mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student',(err) => {
    
    
    if(!err){
    
    
        var schema = new mongoose.Schema({
    
    name:String,grades:Number})
        //添加一个测试字段
        // schema.add({test:Number})
        var stuModel = mongoose.model('grades',schema)
        //添加两条数据
        // stuModel.create({name:"小花",grades:76,test:76},{name:"小兰",grades:60,test:30},(err,docs)=>{
    
    
        //     console.log(docs)
        // })

        //字符串 es5中this与obj指向一样,es6中只能用obj
        stuModel.find({
    
    $where:"this.grades == this.test" || "obj.grades == obj.test"},(err,doc) => {
    
    
           if(!err){
    
    
            	console.log(doc)
        	}
        })
        //[{_id: 6017d7cb8a95cb2a00aae3ae,name: '小花',grades: 76,test: 76,__v: 0}]

        //函数
        stuModel.find({
    
    $where:function() {
    
    
            return this.grades == this.test || obj.grades == obj.test*2
        }},(err,doc) => {
    
    
            if(!err){
    
    
                 console.log(doc)
             }
         })
         /*[{_id: 6017d7cb8a95cb2a00aae3ae,name: '小花',grades: 76,test: 76,__v: 0},
            {_id: 6017d7cb8a95cb2a00aae3af,name: '小兰',grades: 60,test: 30,__v: 0}]*/
    }
})

5.5 一般的なクエリ条件

$or     或关系

$nor    或关系取反

$gt     大于

$gte    大于等于

$lt     小于

$lte    小于等于

$ne     不等于

$in     在多个值范围内

$nin    不在多个值范围内

$all    匹配数组中多个值

$regex   正则,用于模糊查询

$size    匹配数组大小

$maxDistance  范围查询,距离(基于LBS)

$mod     取模运算

$near    邻域查询,查询附近的位置(基于LBS)

$exists   字段是否存在

$elemMatch  匹配内数组内的元素

$within    范围查询(基于LBS)

$box     范围查询,矩形范围(基于LBS)

$center    范围醒询,圆形范围(基于LBS)

$centerSphere 范围查询,球形范围(基于LBS)

$slice     查询字段集合中的元素(比如从第几个之后,第N到第M个元素

5.6 特定のタイプのクエリ

_id 名前 成績 __v テスト
6017befb5c36d64d08b72576 シャオ・ミン 68 0 1
6017befb5c36d64d08b72577 小芳 94 0 3
6017c455ba09d355a49ec8eb 少し赤 52 0 5
6017c455ba09d355a49ec8ec シャオ・ガン 46 0 2
6017d7cb8a95cb2a00aae3ae 小さな花 76 0 4
6017d7cb8a95cb2a00aae3af 小蘭 60 0 6

方法

方法 効果
選別 分類する
スキップ 飛び越える
限界 限界
選択する 表示フィールド
期待する 埋め込む
カウント カウント
明確 重複排除

exec() と then()
は両方とも Promise オブジェクトを返します。exec は通常、独立したアクションの 1 回限りの実行に使用され、その後、継続的なアクションに使用されます。それらの使用法はメソッド名からも区別できます。exec は実行を意味し、 then はそれではどうやって、exec と then のパラメータが異なります。前者はコールバック (err、doc)、後者は解決 (doc)、拒否 (err)

場合:

const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student')
var Schema =new mongoose.Schema({
    
     name:String,grades:Number,test:{
    
    type:Number,default:0}})
var stuModel = mongoose.model('grades', Schema);

// 按test从小到大排序
// 1是升序,-1是降序
stuModel.find().sort({
    
    test:1}).exec((err,docs)=>{
    
    
  console.log(docs)
})
// 按test从大到小排列
stuModel.find().sort('-test').exec((err,docs)=>{
    
    
  console.log(docs)
})
// 跳过1个,显示其他
stuModel.find().skip(1).exec((err,docs)=>{
    
    
  console.log(docs)
})
// 显示2个
stuModel.find().limit(2).exec((err,docs)=>{
    
    
  console.log(docs)
})
// 显示name、grades字段,不显示id字段
stuModel.find().select('name grades -id').exec((err,docs)=>{
    
    
  console.log(docs)
})
// 跳过第1个后,只显示2个数据,按照grades由大到小排序,且不显示id字段
stuModel.find().skip(1).limit(2).sort('-grades').select('-id').exec((err,docs)=>{
    
    
  console.log(docs)
  /[{
    
     name: '小明', grades: 78, v: 0, test: 1 },
     {
    
     name: '小花', grades: 76, test: 4, v: 0 }]/
})
// 显示集合stuModel中的文档数量
stuModel.find().count((err,count)=>{
    
    
  console.log(count)
  //6
})
// 返回集合stuModel中的grades的值
stuModel.find().distinct('grades',(err,distinct)=>{
    
    
  console.log(distinct)
  //[ 46, 52, 60, 76, 78, 94 ]
})

6. ドキュメントの更新


6.1 update()

  • Model.update(conditions, doc, [options], [callback])
  • パラメータ
    • 条件: クエリ条件
    • doc: 変更が必要なデータ (挿入されたデータ)
    • [オプション]: 制御オプション

安全 (ブール値): デフォルトは true です。セーフモード。upsert (ブール値): デフォルトは false です。レコードが存在しない場合は新しいレコードを作成します。multi (ブール値): デフォルトは false です。複数のクエリレコードを更新するかどうか。runValidators: 値が true の場合、Validation 検証が実行されます。setDefaultsOnInsert: upsert オプションが true の場合、新しいドキュメントを作成するときにドキュメントに定義されているデフォルト値を挿入します。strict (ブール値): strict モードで更新します。上書き (ブール値): デフォルトは false です。更新専用モードを無効にして、レコードの上書きを許可します。

  • [コールバック]: コールバック関数
  • クエリ条件が設定されている場合、データベースが満たされない場合、デフォルトでは何も起こりません。
  • update() メソッドのコールバック関数を省略することはできません。省略しない場合、データは更新されません。コールバックに有用な情報がない場合は、exec() を使用して簡素化できます。
stuModel.update({
    
    name:'小明'},{
    
    $set:{
    
    test:34}}.exec())

ケース

//第一步,引入mongoose
const mongoose = require('mongoose')
//第二步,连接数据库
mongoose.connect('mongodb://localhost:27017/student',err=>{
    
    
  if(!err){
    
    
    //第三步,创建模板
    var Schema =new mongoose.Schema({
    
     name:String,grades:Number,test:{
    
    type:Number,default:0}})
    // var Schema = new Schema()
    //第四步,将模板映射到集合并创建
    var stuModel = mongoose.model('grades',Schema)

    //查询name为小明的数据,并将其test更改为34
    //若有多个文档,默认只更新第一个
    stuModel.update({
    
    name:'小明'},{
    
    $set:{
    
    test:34}},(err,raw)=>{
    
    
      console.log(raw)
    })
      
     //{ n: 1, nModified: 1, ok: 1 }
	 //6017befb5c36d64d08b72576	小明	68	0	34
  }
})

6.2 updateOne()

  • Model.updateOne(conditions, doc, [options], [callback])
  • update() と同様ですが、唯一の違いは、updateOne() はデフォルトで 1 つのドキュメントを更新することです。{multi:true} が設定されている場合でも、1 つのドキュメントだけを更新することはできません。

6.3 updateMany()

  • Model.updateMany(conditions, doc, [options], [callback])
  • update() と同様、唯一の違いは、updateMany() はデフォルトで複数のドキュメントを更新することです。{multi:false} が設定されている場合でも、1 つのドキュメントだけを更新することはできません。

6.4 検索()+保存()

複雑なアップデートの場合

const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student',err=>{
    
    
  if(!err){
    
    
     var Schema =new mongoose.Schema({
    
     name:String,grades:Number,test:{
    
    type:Number,default:0}})
     var stuModel = mongoose.model('grades',Schema)
	
     //查询成绩小于60的数据,并在其名字后添加‘:差生’字段
     stuModel.find({
    
    grades:{
    
    $lt:60}},(err,docs)=>{
    
    
      console.log(docs);
      /*[{test: 0,_id: 6017c455ba09d355a49ec8eb,name: '小红',grades: 52,__v: 0},
        {test: 0,_id: 6017c455ba09d355a49ec8ec,name: '小刚',grades: 46,__v: 0}]*/
      
      docs.forEach((item,index,arr) => {
    
    
        item.name += ':差生'
        //将修改后的数据保存
        item.save()
      })
      console.log(docs)
      /*[{test: 0,_id: 6017c455ba09d355a49ec8eb,name: '小红:差生',grades: 52,__v: 0},
        {test: 0,_id: 6017c455ba09d355a49ec8ec,name: '小刚:差生',grades: 46,__v: 0}]*/
    })
  }
})

6.5 findOne() + save()

  • 複雑なアップデートの場合
  • findOne() の戻り値は document オブジェクトです
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student',err=>{
    
    
  if(!err){
    
    
     var Schema =new mongoose.Schema({
    
     name:String,grades:Number,test:{
    
    type:Number,default:0}})
     var stuModel = mongoose.model('grades',Schema)
	
     //查询成绩小于60的数据,并在其名字后添加‘:差生’字段
     stuModel.findOne({
    
    name:'小明'},(err,doc)=>{
    
    
      console.log(doc);
      //{test: 34,_id: 6017c455ba09d355a49ec8eb,name: '小明',grades: 68,__v: 0},
      doc.age += 10
      doc.save()
      console.log(docs)
      //{test: 34,_id: 6017c455ba09d355a49ec8eb,name: '小明',grades: 78,__v: 0}
    })
  }
})

6.6 finOneAndUpdate()

Model.findOneAndUpdate([conditions], [update], [options], [callback])

6.7 findByIdAndUpdate()

Model.findByIdAndUpdate([conditions], [update], [options], [callback])

7. 文書の削除


7.1 deleteOne()

  • 条件に一致するすべてのデータが削除されます
  • モデルの deleteOne()
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student',err=>{
    
    
  if(!err){
    
    
     var Schema =new mongoose.Schema({
    
     name:String,grades:Number,test:{
    
    type:Number,default:0}})
     var stuModel = mongoose.model('grades',Schema)
     //删除名字中包含‘差生’的数据
	 stuModel.deleteOne({
    
    name:/差生/},function(err){
    
    })
     // 回调函数不能省略,但可以使用exec() 简写
     //stuModel.deleteOne({name:/差生/}).exec()
    })
  }
})
  • ドキュメントdeleteOne()
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student',err=>{
    
    
  if(!err){
    
    
     var Schema =new mongoose.Schema({
    
     name:String,grades:Number,test:{
    
    type:Number,default:0}})
     var stuModel = mongoose.model('grades',Schema)
     //删除名字中包含‘差生’的数据
	 stuModel.find({
    
    name:/差生/},function(err,docs){
    
    
         docs.forEach((item,index,arr)=>{
    
    
             item.deleteOne((err,doc)=>{
    
    
                 //doc为被删除的值
                 console.log(doc)
             })
         })
     })
    })
  }
})

7.2 findOneAndRemove()

  • 条件に合致したデータを削除します
  • Model.findOneAndRemove(条件, [オプション], [コールバック])
  • コールバックは省略できませんが、exec() 短縮表現を使用できます。
stuModel.findOneAndRemove({
    
    name:/差生/}).exec()

7.3 findByIdAndRemove()

  • IDでデータを削除(IDは一意です)
  • Model.findByIdAndRemove(条件, [オプション], [コールバック])
  • コールバックは省略できませんが、exec() 短縮表現を使用できます。

8. 前後フック


  • フロントフックとリアフックは pre() メソッドと post() メソッドです (ミドルウェア)
  • ミドルウェアは、静的メソッドやインスタンス メソッドなどと同様に、スキーマ上で指定されます。
  • 前後のフックは装着時にセット可能です。

init validate save delete count find findOne findOneAndRemove findOneAndUpdate insertMany update

  • [pre()]: 特定の操作を実行する前に実行します。

  • [post]: 特定の操作の前後に実行され、next() は使用できません

場合:

const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student')
var Schema =new mongoose.Schema({
    
     name:String,grades:Number,test:{
    
    type:Number,default:0}})
Schema.pre('find',function(next){
    
    
    console.log('我是pre方法1');
    next();
});
Schema.pre('find',function(next){
    
    
    console.log('我是pre方法2');
    next();
});
Schema.post('find',function(docs){
    
    
  console.log('我是post方法1');
});
Schema.post('find',function(docs){
    
    
  console.log('我是post方法2');
});  
var stuModel = mongoose.model('grades', Schema);
stuModel.find(function(err,docs){
    
    
    console.log(docs[0]);
})    
/*
我是pre方法1
我是pre方法2
我是post方法1
我是post方法2
{test: 34, _id: 6017befb5c36d64d08b72576,name: '小明',grades: 78,__v: 0}
*/

9. 書類の検証


  • ドキュメントを保存するときに、スキーマによって設定されたフィールドに従ってドキュメントを設定できることが保証されます。

9.1 [必須]: データは必須です

//将name设置为必填字段,如果没有name字段,文档将不被保存,且出现错误提示
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student')
var Schema =new mongoose.Schema({
    
    
  name:{
    
    
    type:String,
    required:true
  },
  age:Number
})
var stuModel = mongoose.model('students', Schema);
new stuModel({
    
    age:20}).save((err,doc)=>{
    
    
  if(err){
    
    
    return console.log(err)
  }
  console.log(doc)
})

//报错:name: Path `name` is required.

9.2 [デフォルト]: デフォルト値

//设置age字段的默认值为18,如果不设置age字段,则会取默认值
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student')
var Schema =new mongoose.Schema({
    
    
  name:String,
  age:{
    
    
    type:Number,
    default:18
  }
})
var stuModel = mongoose.model('students', Schema);
new stuModel({
    
    name:'李雷'}).save((err,doc)=>{
    
    
  if(err){
    
    
    return console.log(err)
  }
  console.log(doc)
})

//{ age: 18, _id: 6018f3bd7e51343e6c4f212b, name: '李雷', __v: 0 }

9.3 【min】【max】:最小値/最大値

  • 数値のみを扱う
//将age的取值范围设置为[0,10]。如果age取值为20,文档将不被保存,且出现错误提示
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student')
var Schema =new mongoose.Schema({
    
    
  name:String,
  age:{
    
    
    type:Number,
    min:10,
    max:18
  }
})
var stuModel = mongoose.model('students', Schema);
new stuModel({
    
    name:'李雷',age:20}).save((err,doc)=>{
    
    
  if(err){
    
    
    return console.log(err)
  }
  console.log(doc)
})

//age: Path `age` (20) is more than maximum allowed value (18).

9.4 [マッチ]: 通常のマッチ

  • 文字列でのみ機能します
//将name的match设置为必须存在'01'字符。如果name不存在'01',文档将不被保存,且出现错误提示
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student')
var Schema =new mongoose.Schema({
    
    
  name:{
    
    type:String,match:/01/},
  age:Number,
})
var stuModel = mongoose.model('students', Schema);
new stuModel({
    
    name:'李雷',age:20}).save((err,doc)=>{
    
    
  if(err){
    
    
    return console.log(err)
  }
  console.log(doc)
})

//name: Path `name` is invalid (李雷).

9.5 [enum]: 列挙型のマッチング

  • 文字列でのみ機能します
//将name的枚举取值设置为['zs','ls','ww'],如果name不在枚举范围内取值,文档将不被保存,且出现错误提示
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student')
var Schema =new mongoose.Schema({
    
    
  name:{
    
    type:String,enum:['zs','ls','ww']},
  age:Number,
})
var stuModel = mongoose.model('students', Schema);
new stuModel({
    
    name:'lss',age:20}).save((err,doc)=>{
    
    
  if(err){
    
    
    return console.log(err)
  }
  console.log(doc)
})

//name: ValidatorError: `lss` is not a valid enum value for path `name`.

9.6 [検証]: カスタムマッチング

  • validate は実際には関数です。関数のパラメータは現在のフィールドを表します。true を返すと検証に合格することを意味し、false を返すと検証に失敗することを意味します。
//定义名字name的长度必须在4个字符以上
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/student')
var Schema =new mongoose.Schema({
    
    
  name:{
    
    type:String,validate:nameLength},
  age:Number,
})
var stuModel = mongoose.model('students', Schema);
new stuModel({
    
    name:'abcd',age:20}).save((err,doc)=>{
    
    
  if(err){
    
    
    return console.log(err)
  }
  console.log(doc)
})

function nameLength(arg){
    
    
  if(arg.length>4){
    
    
    return true
  }
  return false
}

//name: Validator failed for path `name` with value `abcd`

おすすめ

転載: blog.csdn.net/weixin_43094619/article/details/131923462