安装
- 下载zip包 www.mongodb.com/try/downloa…
- 解压压缩包,放在稳定的目录中
- 将 MongoDB 安装包中的 bin 目录配置到环境 PATH 变量 配置 PATH 环境变量的目的是为了能够在命令行中的任何位置都能够访问到 bin 目录中的可执行程序。
测试:mongod --version
启动和停止数据库
启动: mongod --dbpath "数据存储目录"
mongod --dbpath E:\osoft\mongoDB\mongodb-win32-x86_64-windows-6.0.5\data
关闭: ctrl + c
mongod 默认监听 127.0.0.1:27017。
使用Navicat Premium连接mongoDB
连接前需要在本地打开mongoDB数据库
然后新建数据库
命令
创建集合
db.createCollection('userInfo')
删除集合
db.collection.drop()
文档操作
// 一下的user指collection 是集合的名字
db.user.insert()
db.user.insertOne()
db.user.insertMany([{}, {}])
db.user.save()// 替换已有的文档
db.user.find(<query>, projection)
// query 可选 查询条件
// projection 查询时返回文档中的所有键值
db.user.remove(<query>, {justOne, writeConcern})
// justOne 可选,如果为true|1,则只删除一个文档,否则删除匹配条件的所有文档
// writeConcern 可选 抛出异常的级别
db.user.update(<query>, <update>, {upsert: <boolean>, multi: <boolean>, writeConcern: <document>})
// upsert: 可选,如果不存在update的记录,是否执行插入,如果这个值为true,则执行插入
// multi: 可选,默认为false 只更新找到的一条记录,如果这个参数为true,则更新查出来的多条记录
// writeConcern: 可选 抛出异常的级别
例:
db.col.insert({
title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
只更新第一条记录:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
全部更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
只添加第一条:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
全部添加进去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
全部更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
只更新第一条记录:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
查询条件举例
// 等于
db.col.find({"by":"菜鸟教程"}).pretty()
// 小于
db.col.find({"likes":{$lt:50}}).pretty()
// 小于等于
db.col.find({"likes":{$lte:50}}).pretty()
// 大于
db.col.find({"likes":{$gt:50}}).pretty()
// 大于等于
db.col.find({"likes":{$gte:50}}).pretty()
// 不等于
db.col.find({"likes":{$ne:50}}).pretty()
// and
db.col.find({key1:value1, key2:value2}).pretty()
// or 条件
db.col.find({$or: [{key: value}, {key: value}]})
db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
// $type
db.col.find({"title" : {$type : 'string'}})
db.col.find({"title" : {$type : 2}})
// limit()方法来读取指定数量的数据
db.col.find({},{"title":1,_id:0}).limit(2)
// skip()方法来跳过指定数量的数据
// 显示文档的第二条数据
db.col.find({},{"title":1,_id:0}).limit(1).skip(1)
// 排序 col 集合中的数据按字段 likes 的降序排列
db.col.find({},{"title":1,_id:0}).sort({"likes":-1})
集合
//查询每个坐着所写文章数
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
// 计算总和 $sum
// 计算平均值 $avg
// 获取最小值 $min 最大值 $max
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
与node.js一起
安装
yarn add mongoose
连接数据库
const mongoose = require('mongoose')
const { dbUri } = require('../config/config.default')
// 连接 MongoDB 数据库
mongoose.connect(dbUri, {
useNewUrlParser: true,
useUnifiedTopology: true
})
const db = mongoose.connection
// 当连接失败的时候
db.on('error', err => {
console.log('MongoDB 数据库连接失败', err)
})
// 当连接成功的时候
db.once('open', function () {
console.log('MongoDB 数据库连接成功')
})
// 组织导出模型类
module.exports = {
Menu: mongoose.model('Menu', require('./menu')),
Role: mongoose.model('Role', require('./role')),
Depart: mongoose.model('Depart', require('./depart')),
User: mongoose.model('User', require('./user')),
}
config/config.default
/**
* 默认配置
*/
module.exports = {
dbUri: 'mongodb://127.0.0.1:27017/oview',
jwtSecret: '13a054c8-39ea-11eb-adc1-0242ac120002',
resultData: (data, code=0, message="true") => {return {
code,
data,
message
}}
}
创建model
以用户model为例
const mongoose = require('mongoose')
const baseModel = require('./base-model')
const md5 = require('../util/md5')
const userSchema = new mongoose.Schema({
...baseModel,
// 姓名
username: {
type: String,
required: true
},
// 电话
phone: {
type: String,
},
// 邮箱
email: {
type: String,
},
// 密码
password: {
type: String,
required: true,
set: value => md5(value),
select: false
},
// 头像
image: {
type: String,
default: null
},
// 状态
status: {
type: Boolean,
default: true,
required: true
},
// 备注
remark: {
type: String
},
// 角色
role: {
type: [mongoose.Schema.Types.ObjectId],
ref: 'Role',
},
// 部门
depart: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Depart'
}
})
module.exports = userSchema
baseModel,加入了创建和更新时间
module.exports = {
createdAt: {
type: Date,
default: Date.now
},
updatedAt: {
type: Date,
default: Date.now
}
}
查询
const user = await User.findOne({ username })
// 模糊查询 通过传递正则
let query = {username: new RegExp(req.body.username)}
const user = awiat User.find(query).populate('depart'
// 查询name字段是否重复
const user = await User.find({name, _id: {$ne: req.params.id}}
if (user && user.length > 0) {// 重复}
// 根据id 查询
await User.findById(id)
// 根据email查询一条
await User.findOne({ email })
// 分页查询
await User.find(queryValue)
.populate('depart').populate('role')
.skip((Number.parseInt(pageNum) - 1)*Number.parseInt(pageSize))
.limit(Number.parseInt(pageSize))
.sort({
// -1 倒叙,1 升序
createdAt: -1
})
// 获取条数
total = await User.find(queryValue).count()
新增
let user = new User(req.body.user)
await user.save()
更新
// 根据_id去查找并更新前端传过来的数据
await User.updateOne({_id: req.params.id}, {$set: req.body})
删除
await User.deleteOne({_id: req.params.id})
上传文件到服务端文件夹下
- 安装multer
yarn add multer
- 配置multer
// middleware/multer.js
const multer = require("multer");
var storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, 'public/file/')
},
filename: (req, file, cb) => {
cb(null, new Date().getTime() + '-' + file.originalname)
}
})
var multerConfig = multer({ storage: storage });
module.exports = multerConfig;
- 创建静态资源文件夹
public/file
- 写上传文件路由 router/file.js
const express = require('express')
const { auth } = require('../middleware/auth')
const fileCtrl = require('../controller/upload')
const multerConfig = require('../middleware/multer')
const router = express.Router()
router.post('/upload', auth, multerConfig.single('file') ,fileCtrl.uploadFiles)
module.exports = router
// fileCtrl.uploadFiles
exports.uploadFiles = async (req, res, next) => {
try {
const { file } = req
if (!file) {
res.status(200).json(resultData({}, -1, '文件上传失败'));
}
const result = {
originalname: file.originalname,
filename: file.filename,
path: '/downloadFile/'+ file.filename
}
let fileD = new File(result)
await fileD.save()
fileD = fileD.toJSON()
return res.status(200).json(resultData({data: fileD}, 0, '文件上传成功'));
} catch (error) {
next(error)
}
};
- 开启静态资源访问目录 app.js
// 公开静态文件夹
app.use('/downloadFile/', express.static('./public/file/'))