Nodejs中mongodb的使用及封装

mongodb介绍

mongodb的了解

  • MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
    它的特点:高性能、易部署、易使用,存储数据非常方便。
    在这里插入图片描述
    在这里插入图片描述
  • 一个mongodb中可以建立多个数据库。MongoDB的默认数据库为"db",该数据库存储在data目录中。MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
  • 集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
  • 文档是一个键值(key-value)对(即JSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
  • 一个简单的文档例子如下:
    {“genres”: [“犯罪”,“剧情” ],“title”: “肖申克的救赎”},
    {“genres”: 123,“title”: “肖申克的救赎”}

mongodb的安装

  • 到官网上下载安装
  • 在安装目录下新建 data 目录 data目录下新建db目录
  • 只有bin文件夹是初始存在 data db 是自己新建的
    在这里插入图片描述
    在这里插入图片描述
  • 配置环境变量
    在这里插入图片描述
    在这里插入图片描述
  • win+R 输入cmd 打开两个窗口
  • 输入命令mongod --dbpath 自己创建文件db的路径
    • 注意:如果路径中间有空格的话需要加上引号,例如" D:\a1 file\mongo\data\db"
      在这里插入图片描述
  • 在另一个窗口里输入mongo可以进行mongodb的操作
    在这里插入图片描述

mongodb的操作

库操作

查: show dbs
  	db 查看当前库
建:	use 库名	   没有建,有就切换
删: db.dropDatabase()  删除当前库

集合(表)操作

建:db.createCollection('表名',{配置})
  //配置:{size:文件大小,capped:true,max:条数|文档数} capped定量
  //db.表(集合).isCapped() 返回 true/false 是否是定量
查:show collections / db.getCollectionNames()
删:db.表|集合.drop()

文档(row)操作

db.集合.save({}) //添加一条
db.集合.insert({})  //添加一条
db.insertOne({}) //添加一条

db.集合.save([{},{}]) //多条
db.集合.insert([{},{}]) //多条
//insert  相同ID字段不会进行插入更改	save会

db.集合.deleteOne({要删数据条件描述}) //一条
db.集合.remove({},true)  //一条

db.集合.remove({要删数据条件描述}) //多条
db.集合.remove({}) //清空表

db.集合.udpate({查询条件},{替换条件},插入boolean,全替换boolean)
//将所有的用户名为李四的年龄全都设置为20岁
db.user.update({username:"李四"},{$set:{age:20}},false,true)

第三个参数:如果更新的数据没有的话则插入,默认不插入
第四个参数:默认只更新一条数据,如果要批量更新设置true

查询条件

    {age:22}		         age == 22

	{age:{   $gt:22 }}	age > 22

    {age:{  $lt:22}}      age < 22

	{age:{$gte: 22}}	age>=22

	{age:{$lte:22}}	  age<=22

	{age:{ lte:122,gte:22}}	age<=122 && age>=22

	{$or:[{age:22},{age:122}]}	22 or 122

	{key:value,key2:value2}  value && value2

	{name:/正则/}

替换条件

{$set:{数据}}

{inc:{age:5}} //在原来的基础上年龄递增5

所有:db.集合.find(条件)
条数: db.集合.find().count()
去重:db.集合.distinct(key).length

db.集合.find({条件},{指定要显示列区域})

指定要显示列区域

username:1 显示这个区域

username:0 不显示这个区域

_id 是默认显示

排序

db.集合.find().sort({key:1,key2:-1}) //升
db.集合.find().sort({key:-1})	//降

限定

db.集合.find().limit(number)  //限定     找几条数据
db.集合.find().skip(number)	//跳过     跳过几条数据
db.集合.findOne()//找第一个
db.集合.find().limit(1)  //查询第一条

Nodejs中mongodb的使用

mongodb在Nodejs中的操作

  1. 安装+引入
    npm install mongodb -S
    var mysql = require('mongodb')
  2. 实例化并连接
    let mongoCt = mongodb.MongoClient
    mongoCt.connect('协议://地址:端口',回调(err,client)) err 错误 client链接后的客户端
  3. 链接库和集合
    let db = client.db('库名')
    let user = db.collection('集合名')
  4. 集合操作
//user.API()  集合操作 	返回 对象

//增
	insertOne(对象数据,(err,res)=>{})  //res = 对象  
	insertMany(arr数据,(err,res)=>{}) //res = 对象  
    //res.result.n 结果  ok 状态
    //res.ops内容  数组
    //result.insertedId 插入后的id

//删:
  deleteOne({条件},(err,result)=>{})

//改:
  updateOne({条件},{更新后},(err,res)=>{})
  updateMany({条件},{更新后},(err,res)=>{})
  updateMany({条件},{更新后},{配置},(err,res)=>{})
    //配置: upsert:true 插入	projection:true 全局替换
//查:
  user.find({条件},{skip:1,limit:1,projection:{key:1}},(err,result)=>{result=对象})
  user.find({条件},{projection:{key:0}}).toArray((err,result)=>{reulst==arr})
  user.countDocuments((err,num)=>{num返回数量})

//排
  user.find(..).sort({key:-1}).toArray..
  user.find({},{projection:{},sort:{key:-1}}).toArray..

简单使用

操作步骤

安装+引入

    npm install mongodb -S
    var mysql = require('mongodb');

实例化并连接

    let mongoCt = mongodb.MongoClient;
    mongoCt.connect('协议://地址:端口',回调(err,client)) //err 错误 client链接后的客户端

链接库和集合

    let db = client.db('库名')
    let user = db.collection('集合名');

集合操作

  //user.API()  集合操作 	返回 对象
    
    //增
    	insertOne(对象数据,(err,res)=>{})  //res = 对象  
    	insertMany(arr数据,(err,res)=>{}) //res = 对象  
        //res.result.n 结果  ok 状态
        //res.ops内容  数组
        //result.insertedId 插入后的id
    
    //删:
      deleteOne({条件},(err,result)=>{})
    
    //改:
      updateOne({条件},{更新后},(err,res)=>{})
      updateMany({条件},{更新后},(err,res)=>{})
      updateMany({条件},{更新后},{配置},(err,res)=>{})
        //配置: upsert:true 插入	projection:true 全局替换
    //查:
      user.find({条件},{skip:1,limit:1,projection:{key:1}},(err,result)=>{result=对象})
      user.find({条件},{projection:{key:0}}).toArray((err,result)=>{reulst==arr})
      user.countDocuments((err,num)=>{num返回数量})
    
    //排
      user.find(..).sort({key:-1}).toArray..
      user.find({},{projection:{},sort:{key:-1}}).toArray..

关闭库

    client.close()
Nodejs+mongodb代码
  • 先在mongodb里创建库student
    在这里插入图片描述
  • 再创建其下的集合user
    在这里插入图片描述
  • 插入数据
    在这里插入图片描述
  • 查看
    在这里插入图片描述

Nodejs+mongodb

// 1.安装引入
const mongodb = require('mongodb')

// 2.实例化
const mongoCt = mongodb.MongoClient

// 3.连接 mongodb         默认端口  27017                   回调 err 错误 client 连接后的客户端
mongoCt.connect('mongodb://127.0.0.1:27017', { useUnifiedTopology: true },(err, client) => {
    if (!err) {
        // 4.链接库
        let db = client.db('student')
        // 5.链接集合
        let user = db.collection('user')

        // 6.集合相关操作    user.API()  集合操作 	返回 对象

            // 增


            // insertOne(对象数据,(err,res)=>{})  //res = 对象  
            // user.insertOne({"username" : "熊大", "age" : "17", "address" : "树林"},(err,res)=>{
            //     if(!err){
            //         // console.log(res)
            //         console.log(res.result.n) //结果 ok   1
            //         console.log(res.ops)//  数组 
            //        /* [
            //             {
            //               username: '熊大',
            //               age: '17',
            //               address: '树林',
            //               _id: 5e6f574fa9dc53365059251d
            //             }
            //           ]*/
            //         console.log(res.insertedId)//  插入后的id  5e6f575ea8e1d721fc88552c
            //         // 7.关闭链接     要在异步回调里关闭链接 否则会执行不了集合相关操作
            //         client.close()
            //     }
            // })


                // user.insertMany([{"username" : "李二", "age" : "25", "address" : "北京"},
                // {"username" : "刘彦", "age" : "17", "address" : "上海"}],(err,res)=>{
                //     console.log(res.ops)
                //     /*
                //         [
                //             {
                //                 username: '李二',
                //                 age: '25',
                //                 address: '北京',
                //                 _id: 5e6f59f436b34d37a4f2116f
                //             },
                //             {
                //                 username: '刘彦',
                //                 age: '17',
                //                 address: '上海',
                //                 _id: 5e6f59f436b34d37a4f21170
                //             }
                //         ]
                //     */ 
                //     console.log(res.insertedIds)//{ '0': 5e6f59f436b34d37a4f2116f, '1': 5e6f59f436b34d37a4f21170 }

                //     // 7.关闭链接
                //     client.close()

                // })


                // 删除
                //deleteOne({条件},(err,result)=>{})
                //deleteMany({条件},(err,result)=>{})
                // user.deleteMany({username:'熊大'},(err,res)=>{
                //     console.log(res.ops)
                //     console.log(res.insertedIds)

                //     // 7.关闭链接
                //     client.close()
                // })


                // 更新
                
                //updateMany({条件},{更新后},{配置},(err,res)=>{})  配置: upsert:true 插入	projection:true 全局替换
                // user.updateMany(
                //     {age:{$gt:22}},
                //     {$set:{address:"人民公园"}}
                //     // { upsert:true},
                //     // {projection:true }
                // ,(err,result)=>{
                //     console.log("result",result)
                //     // 7.关闭链接
                //     client.close()
                // })


                // 查询操作

                // user.find({条件},{skip:1,limit:1,projection:{key:1}},(err,result)=>{result=对象})
                // user.find({条件},{projection:{key:0}}).toArray((err,result)=>{reulst==arr})
                // user.countDocuments((err,num)=>{num返回数量})

                // user.find({age:{$gt:30}},(err,res)=>{
                //     res.toArray((err,data)=>{
                //         console.log('data',data)
                //         /*
                //       data [
                //                 {
                //                     _id: 5e6f5ead75428112e5cc9c47,
                //                     username: '黄河',
                //                     age: 35,
                //                     address: '人民公园'
                //                 },
                //                 {
                //                     _id: 5e6f5ead75428112e5cc9c48,
                //                     username: '李而',
                //                     age: 33,
                //                     address: '人民公园'
                //                 }
                //             ]
                //         */
                //			 7.关闭链接
               //     		client.close()
                //     })
                // })


                // user.find({age:{$gt:30}}).toArray((err,data)=>{
                //     console.log('data',data)
                //     /* 
                //     data [
                //         {
                //           _id: 5e6f5ead75428112e5cc9c47,
                //           username: '黄河',
                //           age: 35,
                //           address: '人民公园'
                //         },
                //         {
                //           _id: 5e6f5ead75428112e5cc9c48,
                //           username: '李而',
                //           age: 33,
                //           address: '人民公园'
                //         }
                //       ]
                //       */
                // 		7.关闭链接
                //     client.close()
                // })


                // 排序与分页
                user.find({},{
                    skip:3,   //跳过两个数据
                    limit:2,   //拿到两个数据
                    sort:{age:1,_id:-1}  // 先按age升序排列 age若相同 则按_id降序排列
                }).toArray((err,res)=>{
                    console.log(res)
                    /*
                  [
                    {
                        _id: 5e6f5ead75428112e5cc9c40,
                        username: '张三',
                        age: 18,
                        address: '人民公园'
                    },
                    {
                        _id: 5e6f5ead75428112e5cc9c44,
                        username: '诸葛亮',
                        age: 19,
                        address: '宁夏'
                    }
                ]
                    */
                    // 7.关闭链接
                   client.close()
                })

    } else {
        console.log('库连接失败...', err)
    }

})

express+mongodb

  • 数据库中的内容
    在这里插入图片描述
//安装引入 express  mongodb
const express = require('express')
const mongodb = require('mongodb')
// 创建服务器

app = express()
app.listen(3000)

// 创建端口
app.get('/api/user', (req, res) => {

    let { _page, _limit } = req.query  //解构赋值
    // 相当于
    // let _page=req.query._page
    // let _limit=req.query._limit
    // console.log(typeof _page,typeof _limit)// string string  需要数字类型

    // 创造实例
    let mongoCt = mongodb.MongoClient
    //连接
    mongoCt.connect('mongodb://127.0.0.1:27017', { useUnifiedTopology: true },(err, client) => {
        if (!err) {
            // 链接库
            let db = client.db('student')
            // 链接集合
            let user = db.collection('user')

 
                user.find({}, {
                    //_page 页数   _limit  一页有多少条内容
                    skip: (_page - 1) * _limit-0,  //隐式转换 将字符串转换为 数字
                    limit: _limit-0,
                }).toArray((err, result) => {
                    res.send({
                        err:0,
                        data:result
                    })
                })

        } else {
            res.send('库连接失败...', err)
        }

    })
})
  • 利用postman测试接口
    在这里插入图片描述

mongodb的封装

封装mongodb连接库操作

  • 封装
//引入 mongodb
const mongodb=require('mongodb')
//实例
let mongoCt=mongodb.MongoClient

//输出

//函数参数的解构 与 函数参数的默认值的赋值
module.exports=({dbName='student',collectionName,success,error,url='mongodb://127.0.0.1:27017'})=>{
    //连接
    mongoCt.connect(url, { useUnifiedTopology: true },(err, client) => {
        if (!err) {
            // 链接库
            let db = client.db(dbName)
            // 链接集合
            let collection = db.collection(collectionName)

            // if(success) success(user,client)   
            success && success(collection,client)    //短路  与上一行代码相同
               

        } else {
           error && error(err)     //短路
        }

    })
}


  • 引用自定义模块
//安装引入 express  mongodb  自定义模块
const express = require('express')
const mongodb = require('./mongodb')
// 创建服务器

app = express()
app.listen(3000)

// 创建端口
app.get('/api/user', (req, res) => {

    let { _page, _limit } = req.query  //解构赋值
    // 相当于
    // let _page=req.query._page
    // let _limit=req.query._limit
    // console.log(typeof _page,typeof _limit)// string string  需要数字类型

    mongodb({
        collectionName: 'user',
        success: (collection, client) => {
            collection.find({}, {
                //_page 页数   _limit  一页有多少条内容
                skip: (_page - 1) * _limit - 0,  //隐式转换 将字符串转换为 数字
                limit: _limit - 0,
                sort:{age:1,_id:-1}    //排序
            }).toArray((err, result) => {
                res.send({
                    err: 0,
                    data: result
                })
                // 关闭库  
                client.close()
            })
        },
        error: err => {
            res.send('库连接失败...', err)
        }
    })

})

  • 测试
    在这里插入图片描述

利用 Promise 封装mongodb连接库操作

  • 封装
//引入 mongodb
const mongodb = require('mongodb')
//实例
let mongoCt = mongodb.MongoClient


//函数参数的解构 与 函数参数的默认值的赋值
let open = ({ dbName = 'student', collectionName, success, error, url = 'mongodb://127.0.0.1:27017' }) => {
    return new Promise((resolve, reject) => {
        mongoCt.connect(url, { useUnifiedTopology: true }, (err, client) => {
            if (!err) {
                // 链接库
                let db = client.db(dbName)
                // 链接集合
                let collection = db.collection(collectionName)
                resolve({collection, client})    
            } else {
                reject(err)
            }
        })
    })
}

//输出
exports.open=open

  • 引用自定义模块
//安装引入 express  mongodb
const express = require('express')
const mongodb = require('./mongodb')
// 创建服务器

app = express()
app.listen(3000)

// 创建端口
app.get('/api/user', (req, res) => {

    let { _page, _limit } = req.query  //解构赋值
    // 相当于
    // let _page=req.query._page
    // let _limit=req.query._limit
    // console.log(typeof _page,typeof _limit)// string string  需要数字类型

    mongodb.open({
        collectionName: 'user'
    }).then(({collection, client}) => {
        collection.find({}, {
            //_page 页数   _limit  一页有多少条内容
            skip: (_page - 1) * _limit - 0,  //隐式转换 将字符串转换为 数字
            limit: _limit - 0,
            sort: { age: 1, _id: -1 }  //排序
        }).toArray((err, result) => {
            res.send({
                err: 0,
                data: result
            })
            // 关闭库  
            client.close()
        })
    }).catch((err) => {
        res.send('连接库失败...', err)
    })

})

  • 测试
    在这里插入图片描述

封装mongodb查询数据,分页,根据动态Id查看详情操作

  • 封装
let mongodb = require("mongodb")
let mongodCt = mongodb.MongoClient
let ObjectId =  mongodb.ObjectId //把字符串转成ObjectId的对象类型  mongodb数据库中id是objectId
//链接库
/*
    dbName:数据库名称 默认值就是student
    collectionName:集合名字
    url:链接的url地址
*/
let open = ({dbName='student',collectionName,url="mongodb://127.0.0.1:27017"})=>{
    return new Promise((resolve,reject)=>{
        mongodCt.connect(url,{useUnifiedTopology: true},(err,client)=>{
            if(err){
                reject(err)
            }else{
                let db = client.db(dbName)
                let collection = db.collection(collectionName)
                resolve({collection,client})
            }
        })
    })
}

//查询库集合列表数据
let findList = ({
    collectionName,//集合名字
    dbName='student',//默认指明的数据库的名字
    _page,_limit,_sort,q
})=>{

    //生成检索条件
    let rule = q ? {username:new RegExp(q,'g')} : {}   //张三  张三丰   
    // let rule = q ? {username:eval('/'+q+"/")} : {}

    return new Promise((resolve,reject)=>{
        //链接数据库
        open({dbName,collectionName})
            .then(({collection,client})=>{
                //查询列表
                collection.find(rule,{
                    skip:_page*_limit,//跳过多少条数据
                    limit:_limit,//限定每一页的数量
                    sort:{[_sort]:1} //排序字段_sort  当一个变量作为key使用的时候,需要采用[]的语法
                }).toArray((err,result)=>{
                    if(!err && result.length>0){
                        resolve({err:0,data:result})
                    }else{
                        resolve({err:1,msg:"查无数据..."})
                    }
                    //关闭资源
                    client.close()
                })
            })
            .catch(err=>{ //链接数据库失败
                reject({err:1,msg:"数据库链接失败...."})
            })
    })
}


//根据动态id获取详情数据
let findDetail = ({
    dbName="student",//默认查询的数据库名字
    collectionName,//集合名字
    _id=null  //外面传入的_id 
})=>{
    return new Promise((resolve,reject)=>{
        //链库操作
        open({dbName,collectionName})
            .then(({collection,client})=>{
                //查询
                if(_id.length === 24){
                    collection.find({_id:ObjectId(_id)}).toArray((err,data)=>{   
                        //返回结果 
                        if(!err && data.length>0){
                            resolve({err:0,data:data[0]}) //因为result是一个数组,里面仅仅包含一条数据
                        }else{
                            resolve({err:1,msg:"查询不到数据...."})
                        }
                    })
                }else{
                    reject({err:1,msg:"id长度有误..."})
                }
            })
            .catch(err=>reject({err:1,msg:"链接数据库失败...."}))
    })
}



exports.open = open;  //{open:函数}
exports.findList = findList;  
exports.findDetail = findDetail;  

  • 引入自定义模块
//1.引入mongodb客户端包
// const mongodb = require("mongodb")
const express = require("express")
let app = express()
//引入封装的mongodb
let mongodb = require("./mongodb")
app.listen(3000,()=>console.log("server is running....."))

//创建接口
app.get("/api/user",(req,res,next)=>{
    //对象的解构赋值操作
    let {_page,_limit,_sort,q} = req.query;
    _page = _page - 1
    _limit = _limit - 0
    _sort = _sort || 'age'


    mongodb.findList({
        collectionName:"user",
        _page,_limit,_sort,q
    }).then(result=>{
        res.send(result)
    }).catch(err=>{
        res.send(err)
    })
    
})


//查询详情
app.get("/api/user/:_id",(req,res,next)=>{
    //获取参数
    let {_id} = req.params
    mongodb.findDetail({
       collectionName:"user",
       _id
    }).then(result=>res.send(result))
    .catch(err=>res.send(err))
})

  • 测试
    在这里插入图片描述
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值