mongoDB+nodejs

176 阅读3分钟

安装

  1. 下载zip包 www.mongodb.com/try/downloa…
  2. 解压压缩包,放在稳定的目录中
  3. 将 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

image.png 连接前需要在本地打开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})

上传文件到服务端文件夹下

  1. 安装multer
yarn add multer
  1. 配置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;
  1. 创建静态资源文件夹 public/file image.png
  2. 写上传文件路由 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)
  }
};

  1. 开启静态资源访问目录 app.js
// 公开静态文件夹
app.use('/downloadFile/', express.static('./public/file/'))
  1. 上传成功后访问文件 http://localhost:3000/downloadFile/1682479059465-W1.png

本文有关的nodejs代码在如下仓库

gitee.com/olhong/o-vi…