文章目录
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中的操作
- 安装+引入
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..
简单使用
操作步骤
安装+引入
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))
})
- 测试