MongoDB笔记

mongoDB非常灵活,让我们脱离SQL语句来操作数据库 它是动态的数据库,不需要提前设定表结构,只需要执行代码像操作对象一样操作数据即可 建库等过程是自动实现的

MongoDB 教程 | 菜鸟教程
CenterOS安装https://www.cnblogs.com/tianyamoon/p/9860656.html

一. 关系型数据库和非关系型数据库

  • 表就是关系,表与表之间存在关系
  • 所有关系型数据库都需要设计表结构
  • 关系型数据库支持约束 如 唯一 主键 默认值 非空 等等
  • 非关系型数据库非常灵活
  • 好多非关系型数据库就是键值对
  • 但是MongoDB是长得最像关系型的非关系型
  • 对MongoDB来说: 数据库 --> 数据库
  • 数据表 --> 集合(可以想象成一个数组)
  • 表记录 --> 文档对象(可以想象成数组存入的对象)
  • MongoDB无需设计表结构
  • 也就是说: 可以任意存入数据,没有结构这一说

mongodb数据库服务就像一个大对象,里面是一个个的数据库,每个数据库中都有几个集合(列表),每个集合(列表)中都是一对对的键值对数据对象

二.安装

Download Center: Community Server​www.mongodb.com![https://upload-images.jianshu.io/upload_images/16670204-d3746381da08c4ce.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

下载安装,然后配置环境变量

image

然后打开cmd确认一下,输入 mongod --version

image

三. 启动和停止数据库服务

1.启动数据库服务

在启动之间先新建一个文件夹 C:\data\db,

然后控制台输入:

mongod
image

2.关闭数据库服务

1.开启服务的控制台,直接ctrl+c即可停止
2.直接关闭控制台

3.连接数据库

在新的CMD中

mongo   //默认连接本机数据库
image

4.断开数据库连接

exit
image

四. 基本命令

1. 显示数据库列表

show dbs   //显示所有数据库

2. 查看当前连接的数据库

db
image

3. 创建新数据库/使用数据库

use 数据库名 //这条命令会切换到某数据库,如果这个数据库不存在,会新建(有数据的瞬间新建)

4. 插入数据

不需要建表,直接写数据 (其实,系统会根据您的命令创建集合,并往集合里写入数据)

db.students.insertOne({"name":"Tom"})
image

5. 显示集合

show collections
image

6. 查询集合中的所有数据

db.students.find()
image

7.增删改查

增:见第七节

查:见第八节

删:见第九节

改:见第十节

五.如何通过node-js操作mongo-db

1.使用官方包mongodb操作(原生的,不推荐使用)

$ npm install mongodb --save

2.使用第三方mongoose来操作

mongoose是基于上述官方包的二次封装.

mongodb是动态的,非常灵活,只需要在 代码中设计数据库,mongoose可以让你的设计编写变得非常简单

Mongoose.js中文网​www.mongoosejs.net

安装:

cnpm i mongoose --save

使用:

const mongoose = require('mongoose');
//引包
mongoose.connect('mongodb://localhost/test');
//连接数据库

//创建一个模型(设计数据库) 
const Cat = mongoose.model('Cat', { name: String });
//表名是cats(里面都是Cat,所以表名是cats) (*^_^*)
//要求里面有一个属性name,类型为字符串

//实例化一个数据
const kitty = new Cat({ name: 'Zildjian' });
//实例了一个小猫kitty,它的名字是Zildjian

//持久化保存这个示例
kitty.save().then(() => console.log('meow')); 
最后一行的猫叫,代表存储成功

接下来解决上面的两个提醒,

看了看是方法将被弃用,应该使用新方法,如果使用新方法,在构建连接时要传入对应的参数,

那就传吧

mongoose.connect('mongodb://localhost/test',{useNewUrlParser:true,useUnifiedTopology:true},(err)=>{
    if(err) return console.log('connection ERR:'+err);
    return console.log('connection success');
});
解决了

简单查询一下:

六 如何使用mongoose来设计数据库

1.引包

const mongoose =  require('mongoose');

2.连接数据库(没有会新建)

mongoose.connect('mongodb://localhost/db2',{useNewUrlParser:true,useUnifiedTopology:true},
(err)=>{
    if(err) return console.log('connection ERR:'+err);
    return console.log('connection success');
});

3.设计表结构

①.先拿到mongoose的架构模型

var Schema = mongoose.Schema

②.在实例化一个数据模型

var studentSchema = new Schema({
    name: String,
    age: Number,
    gender: Number,
    school: String,
    hidden: Boolean,
    reward: [{ rewardName: String, date: { type: Date, default: Date.now } }],
})

但是,这样设计约束太少了!!!让我们来看约束版本:

    name: {
        type: String,
        required: true,
    },

③ 将文档结构发布为模型

var Student=mongoose.model('student',studentSchema)//模型,不是模块.这里要注意单词model

将一个架构发布为一个模型,第一个参数传入一个大写单数字符串,最终mongoose会自动生成一个小写复数的集合(数据表). 可以认为是创建了一个可以持久化存储的类对象.

④ 有了这个类对象之后,我们就可以对数据为所欲为了~

4.模块化设计

使用mongodb,我们应该了解三个概念

  • schema相当于数据的模型

我们创建一个schema/user.js文件,专门来做数据库模型

const mongoose = require('mongoose');

var Schema = mongoose.Schema
var userSchema = new Schema({
    email: { type: String, required: true },
    nickname: { type: String, required: true },
    password: { type: String, required: true },
    created_time: { type: Date, default: Date.now },
                        //这里不要直接写 Date.now() 如果写了,模块执行时就会写死
    last_modified_time: { type: Date, default: Date.now },
    avatar: { type: String, default: '/public/img/avatar-default.png' },
    bio: { type: String, default: '' },
    gender: { type: Number, enum: [0, 1, -1], default: -1 },
    birthday: { type: Date },
    status: {
        type: Number, enum: [0,//正常用户
            1,//不可评论
            2,//不可登录
        ]
    },
})

module.exports = mongoose.model('User', userSchema)

在app.js中连接数据库

const mongoose = require('mongoose');

//mongoDB
mongoose.connect('mongodb://localhost/db3',{useNewUrlParser:true,useUnifiedTopology:true},(err)=>{
    if(err) return console.log('connection ERR:'+err);
    return console.log('connection success');
});

如果哪个地方想用它

var User=require('./models/user') 

七 新增数据操作

1.创建一条数据 (实例化一个模型对象)

var stu1=Student({
    name:'oliver',
    age:18,
    gender:1,
    school:'湘北中学',
    hidden:false
})

2. 存储数据

stu1.save((err,ret)=>{
    if(err) return console.log('存储失败'+err);
    return console.log('存储成功'+ret)
})
image

八 查询数据

1.查询所有

Student.find((err,ret)=>{
    if(err) return console.log(err);
    return console.log(ret);    
})

2.按条件查询

把条件封装成一个对象放在第一个参数即可

Student.find({name:"anny"},(err,ret)=>{
    if(err) return console.log(err);
    return console.log(ret);    
})

3.只找匹配的第一个

Student.findOne({name:"anny"},(err,ret)=>{
    if(err) return console.log(err);
    return console.log(ret);    
})

4.按ID查询

Student.findById('5e48ceb5047cfa2bcc970228',(err,ret)=>{
    if(err) return console.log(err);
    return console.log(ret);    
})

5.多个条件查询

User.find({
        $or: [
            { email: req.body.email },
            { nickname: req.body.nickname }
        ]
    }, (err, data) => {})

九 删除数据

1.按条件删除

Student.deleteMany({name:'anny'},(err,ret)=>{
    if(err) return console.log(err);
    return console.log(ret);    
})

2.按条件删除一个

Student.deleteOne({name:'anny'},(err,ret)=>{
    if(err) return console.log(err);
    return console.log(ret);    
})

还有一种方法

还有一种方法
Student.findOneAndDelete({name:'anny'},(err,ret)=>{
    if (err) return console.log('失败'+err);
    return console.log('成功');
})

3.按ID查询然后删除

Student.findByIdAndDelete("5e48c7118967a217d09e7838", (err, ret) => {
    if (err) return console.log('失败'+err);
    return console.log('成功');
})

还有一种

Student.findByIdAndRemove("5e48ce979b24812260a0217d", (err, ret) => {
    if (err) return console.log('失败'+err);
    return console.log('成功');
})

十 修改数据

1.按ID查询然后修改

Student.findByIdAndUpdate('5e48c7118967a217d09e7838',{age:8},(err,ret)=>{
    if (err) return console.log('更新失败'+err);
    return console.log('更新成功');    
})

2.按条件查找然后修改

Student.updateMany({name:'anny'},{age:6},(err,ret)=>{
    if (err) return console.log('更新失败'+err);
    return console.log('更新成功');    
})

3.按条件查找一个然后修改

Student.updateOne({name:'anny'},{age:10},(err,ret)=>{
    if (err) return console.log('更新失败'+err);
    return console.log('更新成功');    
})

还有一种

Student.findOneAndUpdate({name:'anny'},{age:8},(err,ret)=>{
    if (err) return console.log('更新失败'+err);
    return console.log('更新成功');    
})

十一.可视化软件

The Smartest GUI Admin Tool for MongoDB

Navicat for MongoDB | MongoDB 数据库管理和开发工具

robo 3T
https://robomongo.org/download

十二.综合练习

我们将之前写的学生管理系统改为mongodb数据库

之前的版本:

https://github.com/zfdok/node_stu_mgr

需要的知识:

熊爸天下:node-js备忘(二)

修改后的版本:

https://github.com/zfdok/node_stu_mongoDB

十三. 一个完善的mongoose.

0. 安装mongoose和glob

node的glob模块允许你使用 *等符号, 来写一个glob规则,像在shell里一样,获取匹配对应规则的文件.

cnpm install mongoose -S
cnpm install glob -S

1. 先建立连接

项目文件夹下建立一个database文件夹,用来存放和数据库操作有关的文件。在database文件夹下,建立一个init.js文件,用来作数据库的连接和一些初始化的事情。
/项目目录/database/init.js

const mongoose = require("mongoose")
const db = "mongodb://localhost/smile-db"
const glob = require('glob')
const {resolve} = require('path')


//批量引入schema
exports.initSchemas = () =>{ 
  glob.sync(resolve(__dirname,'./schema/','**/*.js')).forEach(require)
}

exports.connect = () => {
  //连接数据库
  mongoose.connect(db)

  let maxConnectTimes = 0

  return new Promise((resolve, reject) => {
    //把所有连接放到这里

    //增加数据库监听事件
    mongoose.connection.on('disconnected', () => {
      console.log('***********数据库断开***********')
      if (maxConnectTimes < 3) {
        maxConnectTimes++
        mongoose.connect(db)
      } else {
        reject()
        throw new Error('数据库出现问题,程序无法搞定,请人为修理......')
      }

    })

    mongoose.connection.on('error', err => {
      console.log('***********数据库错误***********')
      if (maxConnectTimes < 3) {
        maxConnectTimes++
        mongoose.connect(db)
      } else {
        reject(err)
        throw new Error('数据库出现问题,程序无法搞定,请人为修理......')
      }

    })
    //链接打开的时
    mongoose.connection.once('open', () => {
      console.log('MongoDB connected successfully')
      resolve()
    })

  })

}

然后在/项目/index.js (或者app.js)里加入立即执行函数,在使用前记得用require进行引入 connect。

//引入connect
const {connect} = require('./database/init.js') 

//立即执行函数
;(async () =>{
    await connect()
})()

2. 再创建schema

我们在database/schema下创建user.js

const mongoose = require('mongoose')    //引入Mongoose
const Schema = mongoose.Schema          //声明Schema
let ObjectId = Schema.Types.ObjectId    //声明Object类型

//创建我们的用户Schema
const userSchema = new Schema({
    UserId:ObjectId,
    userName:{unique:true,type:String},
    password:String,
    createAt:{type:Date,default:Date.now},
    lastLoginAt:{type:Date,default:Date.now}
})

//发布模型
mongoose.model('User',userSchema)

十四.打通前后端

https://www.jspang.com/detailed?id=61


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容