非关系型数据库(mongodb)简单使用介绍

news2025/1/31 3:08:30

关系型数据库与非关系型数据库

  • 关系型数据库有mysql、oracle、db2、sql server等;

关系型数据库特点:关系紧密,由表组成;

优点:

        易于维护,都是使用表结构,格式一致;

        sql语法通用,可用于复杂查询;

缺点:

        读写性能差,尤其是海量数据的高效率读写;

        有固定的表结构,字段不可随意更改,灵活性稍欠;

        高并发读写需求,对传统关系型数据库来说,硬件I/O读写是一个很大的瓶颈;

  • 非关系型数据库(NoSQL)有MongoDB、Redis等

非关系型数据库特点:关系不紧密,有文档,有键值对;

优点:

        格式灵活,存储数据的格式可以是key/value形式;

        速度快,nosql可以内存作为载体,而关系型数据库只能使用硬盘;

        易用,nosql数据库部署简单;

缺点:

        不支持sql语法,学习和使用成本较高;

        不支持事物;

        复杂查询时语句过于繁琐;

MongoDB

MongoDB简介

MongoDB是为快速开发互联网web应用而设计的数据库系统,设计目标时极简、灵活,作为web应用栈的一部分;

MongoDB的数据模型是面向文档的,所谓文档是一种类似JSON的结构,简单理解MongoDB这个数据库中存的是各种各样的JSON(其实是BSON);此处文档就相当于关系型数据库中的一条数据,而关系型数据库中的一个表对应非关系型数据库中的一个集合;

MongoDB默认的端口号是27017;

基本命令

db // 查看当前操作在哪一个数据库
show dbs // 查看数据库列表(一共有几个数据库,若数据库为空,不出现在列表中)
use xxx // 切换到xxx数据库,若不存在,则创建一个xxx库
show collections // 展示当前数据库中所有的集合
// 新增数据
db.xxx.insert(文档对象)  // 向当前数据库的xxx集合中插入一个文档
db.xxx.insertOne(文档对象) // 向当前数据库的xxx集合中插入一个文档
db.xxx.insertMany([文档对象,文档对象]) // 向当前数据的xxx集合中插入多条文档

// 删除数据
db.xxx.remove(查询条件) // 根据查询条件删除某些文档

// 查看数据
db.xxx.find(查询条件[,投影])  // 根据查询条件查询数据,投影为可选项,不加则返回该条文档的全部字段
db.xxx.findOne(查询条件[,投影]) // 只查找第一个找到的数据,应用于确认数据库中只存在一条数据的查找,可提高效率(查到一条不再继续查找)

// 修改更新数据
db.xxx.update(查询条件,要更新的内容[,配置对象]) // 更新查到的文档,若不加要更新的内容,则会将更换内容替换整个文档
例: db.xxx.update({name: '小明'}, {age: 19}) // 将会把查到的这条数据整体用name和age字段替换,其它自动就没了
db.xxx.updateOne(查询条件,要更新的内容[,配置对象]) // 更新查到的第一个文档
例:db.xxx.updateOne({name: '小明' }, {$set : {age : 20}}) // 将查到的name是小明的第一条数据的age修改为20,其余保持原来样子
db.xxx.updateMany(查询条件,要更新的内容[,配置对象]) // 更新查到的多条文档
例:db.xxx.update({name: '小明' }, {$set : {age : 20}}, {multi: true}) // 将查到的name是小明的所有数据的age修改为20,其余保持原来样子

上述投影是指:去掉不想要的数据(用0表示),只保留想要展示的数据(用1表示),0和1不能同时使用;

db.xxx.find({}, {_id: 0, name: 0}) // 查找到的数据只展示除_id与name字段
db.xxx.find({}, {age: 1}) // 查找到的数据只展示age字段

常用的操作符如下:

1、小于、 小于等于、 大于、大于等于、不等于 分别对应$lt、$lte、$gt、$gte、$ne

db.xxx.find({age: $lte: 20}) // 查找年龄小于等于20岁的人

2、逻辑或:使用$in 或 $or

db.xxx.find( {age: { $in[20, 30] }} ) // 查找年龄为20或30的人
db.xxx.find( {age: {$or[{age: 20}, {age: 30}]}}) // 查找年龄为20或30的人

3、逻辑非:使用$nin

db.xxx.find({age: {$nin: [20, 30]}}) // 查找年龄不是20或30岁的人

 4、支持正则匹配条件

db.xxx.find({name: /^m/}) // 查找name以m开头的数据

 5、支持where函数查找

db.xxx.find({$where: function() {
    return this.name === '小明' && this.age === 18
    }
}) // 查找名为小明并且年龄是18的数据

mongoose的使用

mongoose是一个在node平台下,用于帮助开发者连接mongodb的包(它是一个对象文档模型ODM库),它对node原生的MongoDB模块进行了进一步的优化封装,并提供了更多的功能,可以更加简单、方便、安全、稳定的操作mongoDB);

mongoose的使用包括四个步骤:

  • 引入mongoose
  • 连接数据库(并绑定监听)
  • 创建模型对象(模型对象上绑定了方法)
  • 操作数据库(通过模型对象进行增删改查等)
// index.js文件

let mongoose = require('mongoose') // 引入mongoose

// 连接数据库 
// mongodb://127.0.0.1:27017/xxx 表示连接的哪台服务器上的xxx数据库
mongoose.connect('mongodb://127.0.0.1:27017/xxx', {
  useNewUrlParser: true, // 使用一个新的url解析器,用于解决一些安全性问题
  useUnifiedTopology: true // 使用一个统一的新的拓扑结构
})

// 绑定数据库连接的监听
mongoose.connection.on('open', function(err) {
    if(err) {
      console.log('数据库连接失败', err)
    } else {
      console.log('数据库连接成功')
      // 在此处做一些数据库的增删改查操作
    }
})

模式对象与模型对象

模式对象即Schema,可通过Schema对集合进行约束;通过mongoose.Schema即可后对其进行约束;

// 引入mongoose
let mongoose = require('mongoose')
let Schema = mongoose.Schema

// 对其进行约束
let studentsRule = new Schema({
    stu_id: {
        type: String, // 限制为字符串
        required: true, // 限制必填
        unique: true // 限制学号唯一
    },
    name: {
        type: String, // 限制为字符串
        required: true, // 限制必填
    },
    sex: {
        type: String, // 限制为字符串
        required: true, // 限制必填
    },
    hobby: [String], // 限制为字符串数组
    info: Schema.Types.Mixed, // 接收所有类型
    date: {
        type: Date,
        default: Date.now() // 设置默认值
    }
})

模型对象相当于数据库中的集合,通过该对象可对集合进行操作;

将创建好的约束与某个集合进行匹配,即可得到模型对象;

// 接上面代码
let stuModel = mongoose.model('students', studentsRule) // 将studentsRule与students集合匹配, stuModel即是模型对象

利用moogose进行CRUD

// 增加数据
模型对象.create(文档对象, 回调函数)

// 删除数据,没有delete方法!
模型对象.deleteOne(查询条件, 回调函数)
模型对象.deleteMany(查询条件, 回调函数)

// 更新修改数据 update方法已被弃用
模型对象.updateOne(查询条件,要更新的内容[, 配置对象], 回调函数)
模型对象.updateMany(查询条件,要更新的内容[, 配置对象], 回调函数)

// 查看数据
模型对象.find(查询条件[, 投影], 回调函数) // 若查找结果为空,返回一个空数组[]
模型对象.findOne(查询条件[, 投影], 回调函数) // 若查找结果为空,返回一个空对象{}

mongose的模块化开发

在实际应用中,由于要建立很多个collection,相对应的就要有很多个模型对象,杂糅在一起就会比较冗余且不好维护,因此需要模块化开发~(示例如下)

// app.js 文件 用于连接及操作数据库
const mongoose = require('mongoose')
const stuModel = require(__dirname + '/model/students') // 引入students模型对象
const teaModel = require(__dirname + '/model/teachers') // 引入teachers模型对象
mongoose.set('strictQuery', true);
mongoose.connect('mongodb://127.0.0.1:27017/demo')
mongoose.connection.on('open', (err) => {
  if (err) {
    console.log('数据库连接失败')
  } else {
    // 连接成功则操作数据库
    // 给students集合插入一条文档
    stuModel.create({"stu_id": 101, "name": "小王", "age": "13"}, (err)=> {
      if (err) {
        console.log(err)
      } else {
        console.log('students插入成功')
      }
    })
    // 给students集合插入一条文档
    teaModel.create({"tea_id": 101, "name": "吴老师", "age": "37"}, (err)=> {
      if (err) {
        console.log(err)
      } else {
        console.log('teachers插入成功')
      }
    })
    console.log('数据库连接成功')
  }
})
// students.js文件
const mongoose = require('mongoose')
var Schema = mongoose.Schema 
let studentsRule = new Schema({
  stu_id: {
    type: String, // 限制为字符串
    required: true, // 限制必填
    unique: true // 限制名称唯一
  },
  name: {
      type: String, // 限制为字符串
      required: true, // 限制必填
      unique: true // 限制名称唯一
  },
  age: {
      type: String, // 限制为字符串
      required: true, // 限制必填
  }
})

// 将studentsRule与students集合匹配, stuModel即是模型对象
let stuModel = mongoose.model('students', studentsRule)

module.exports = stuModel
// teachers.js 文件
const mongoose = require('mongoose')
var Schema = mongoose.Schema 
let teachersRule = new Schema({
  tea_id: {
    type: String, // 限制为字符串
    required: true, // 限制必填
    unique: true // 限制名称唯一
  },
  name: {
      type: String, // 限制为字符串
      required: true, // 限制必填
      unique: true // 限制名称唯一
  },
  age: {
      type: String, // 限制为字符串
      required: true, // 限制必填
  }
})

// 将studentsRule与students集合匹配, stuModel即是模型对象
let teaModel = mongoose.model('teachers', teachersRule)

module.exports = teaModel

 文件结构如下:

控制台输出结果为:

进一步地,可将数据库连接成功或失败后的操作,封装成一个函数,如下:

// 该模块用于连接数据库
const mongoose = require('mongoose')
const opeartion = require('./operation')

mongoose.set('strictQuery', true);
mongoose.connect('mongodb://127.0.0.1:27017/demo')
mongoose.connection.on('open', (err) => {
  if (err) {
    opeartion(err) // 调用opration错误处理方法
  } else {
    opeartion() // 调用opration正确处理方法----操作数据库
  }
})
// 该文件用于处理数据库连接成功或失败的后续操作,一般在此进行数据库的增删改查操作
const stuModel = require(__dirname + '/model/students') // 引入students模型对象
const teaModel = require(__dirname + '/model/teachers') // 引入teachers模型对象

function operation(err) {
  if(err) {
    console.log(err)
  } else {
     // 给students集合插入一条文档
    stuModel.create({"stu_id": 103, "name": "小朋友", "age": "13"}, (err)=> {
      if (err) {
        console.log(err)
      } else {
        console.log('students插入成功')
      }
    })
    // 给students集合插入一条文档
    teaModel.create({"tea_id": 103, "name": "大朋友", "age": "37"}, (err)=> {
      if (err) {
        console.log(err)
      } else {
        console.log('teachers插入成功')
      }
    })
  }
}

module.exports = operation // 将该函数暴露出去

students.js与teachers.js如上面文件一样,文件结构如下:

控制台输出结果如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/363261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

资源消耗降低 90%,速度提升 50%,解读 Apache Doris Compaction 最新优化与实现

背景LSM-Tree( Log Structured-Merge Tree)是数据库中最为常见的存储结构之一,其核心思想在于充分发挥磁盘连续读写的性能优势、以短时间的内存与 IO 的开销换取最大的写入性能,数据以 Append-only 的方式写入 Memtable、达到阈值…

Linux基础命令-lsof查看进程打开的文件

Linux基础命令-uptime查看系统负载 Linux基础命令-top实时显示系统状态 Linux基础命令-ps查看进程状态 文件目录 前言 一 命令的介绍 二 语法及参数 2.1 使用help查看命令的语法信息 2.2 常用参数 2.2.lsof命令-i参数的条件 三 命令显示内容的含义 3.1 FD 文件描述符的…

手工测试1年经验面试,张口要13K,我真是服了····

由于朋友临时有事, 所以今天我代替朋友进行一次面试,他需要应聘一个测试工程师, 我以很认真负责的态度完成这个过程, 大概近30分钟。 主要是技术面试, 在近30分钟内, 我与被面试者是以交流学习的方式进行的…

自动驾驶路径规划概况

文章目录前言介绍1. 路径规划在自动驾驶系统架构中的位置2. 全局路径规划的分类2.1 基础图搜索算法2.1.1 Dijkstra算法2.1.2 双向搜索算法2.1.3 Floyd算法2.2 启发式算法2.2.1 A*算法2.2.2 D*算法2.3 基于概率采样的算法2.3.1 概率路线图(PRM)2.3.2 快速…

docker启动容器报错No chain/target/match by that name.

一、问题描述 docker启动容器时提示: docker start xxx-search Error response from daemon: driver failed programming external connectivity on endpoint microblog-search (801478f2672887ee0fcf60eb7d7970703b4853f44f51b0b5b8622dafdb9580fb): (iptables failed: iptab…

【C ++】C++入门知识(二)

C入门(二) 作者:小卢 专栏:《C》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 1.引用 1.1.引用的概念及应用 引用(&) 引用不是新定义一个变量&#xff0…

前缀和与差分---概念+例题

目录 前缀和 概念 例题 差分 概念 例题 前缀和 概念 在高中学习了数列的概念,跟现在的数组很像。可以类比来看,数组的前缀和与数列的前n项和其实可以看成一个概念。很多算法题利用前缀和的思想也就是可以使用高中里面的前n项和来求解数组里面任何…

3年功能测试经验,面试想拿到15k很难吗?

一直觉得经验多,无论在哪都能找到满意的工作,但是现实却是给我打了一个大巴掌!事后也不会给糖的那种... 个人情况 大概介绍一下个人情况,男,本科,三年多测试工作经验,一毕业因为不成熟的经验以…

大型数据库Oracle12C 复习笔记

大型数据库Oracle1 Oracle基础1.1 Oracle基础概念1.2 Oracle体系结构1.3 多租户架构1.4 Oracle进程1.5 内存结构1.6 文件系统2 Oracle查询3 Oracle对象4 Oracle编程1 Oracle基础 与MySQL、MSSQL不同,Oracle数据库系统是美国ORACLE(甲骨文)公…

还在用chatGPT聊天?《元宇宙2086》已开始用AIGC做漫画连载了!

ChatGPT 是由 OpenAI开发的一个人工智能聊天机器人程序,于 2022 年 11 月推出。该程序使用基于 GPT-3.5架构的大型语言模型并通过强化学习进行训练。 ChatGPT 目前仍以文字方式互动,而除了可以透过人类自然对话方式进行交互,还可以用于相对复…

多线程使用哈希表

❣️关注专栏: JavaEE 多线程环境使用哈希表,HashMap 本身不是线程安全的. 在多线程环境下使用哈希表可以使用: Hashtable(不推荐使用)ConcurrentHashMap(推荐) 🎈1 Hashtable Hashtable是线程安全的&am…

OpenGL中图片尺寸和上屏尺寸不一致的变形问题解决

一、尺寸不一致问题: 图片加载到OpenGL纹理,再将纹理进行上屏的时候,可能会出现图片尺寸和屏幕尺寸不一致,导致图片绘制到屏幕时出现变形的问题: 二、根本原因: 原始图片的纹理尺寸(Textur…

计网之IP协议和以太网

文章目录一. IP协议1. IPv4报头介绍2. 解决IPv4地址不够用的问题3. IP地址管理4. 路由选择二. 以太网三. 浅谈DNS域名解析系统一. IP协议 IP协议是位于OSI模型中第三层(网络层)的协议, 在这层上工作的不止这一个协议, 但IP协议是网络层传输所使用的最主流的一种协议, 有IPv4和…

C语言——指针进阶

目录 前言 一. 字符指针 二. 指针数组 三. 数组指针 3.1 何为数组指针? 3.2 &数组名与数组名 四. 数组参数、指针参数 4.1 一维数组传参 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 五. 函数指针 六. 函数指针数组 七. 指向函数指针数组…

Java 继承中构造函数的问题

继承中构造函数的问题 父类构造函数和子类构造函数的关系 new一个之类对象时默认调用了父类的无参构造函数 ,创建了父类对象 父类的成员变量和成员方法才能创建出来 子类才能继承下来使用 首先创建一个父类,动物类 接下来创建一个子类,狗类&#xff…

基于OSG的虚拟校园系统的设计与实现

基于open scene graph的虚拟校园系统的设计与实现 摘要 •引言 • OSG基本原理 •OSG操作与动画 •视点的定位和切换 •自由漫游 •路径漫游 • 路径动画 • 点选和文字 • 粒子系统 • 3DMAX • 无线通信与数据库设计 • 实现步骤 • 结论 摘要 随着科技的不断发展,人工智能&a…

2023年,8种必备Selenium编写自动化用例的技巧

在开始自动化时,您可能会遇到各种可能包含在自动化代码中的方法,技术,框架和工具。有时,与提供更好的灵活性或解决问题的更好方法相比,这种多功能性导致代码更加复杂。在编写自动化代码时,重要的是我们能够…

2023年网络安全十大发展趋势

近日,中国计算机学会(CCF)计算机安全专委会中来自国家网络安全主管部门、高校、科研院所、大型央企、民营企业的委员投票评选出2023年网络安全十大发展趋势。 趋势一 数据安全治理成为数字经济的基石 我国《数据安全法》提出“建立健全数据…

spring的启动过程(一) :IOC容器的启动过程

一、web容器的加载 首先我们要先知道一个web项目的启动过程。 将Web项目部署到Tomcat中的方法之一,是部署没有封装到WAR文件中的Web项目。要使用这一方法部署未打包的webapp目录,只要把我们的项目(编译好的发布项目,非开发项目&am…

掌握MySQL分库分表(五)SpringBoot2+MybatisPlus整合Sharding-Jdbc水平分表实现

文章目录创建Java-Maven项目创建数据库、表创建Java实体类配置启动类水平分表配置文件配置测试分库分表实现分析控制台SQL逻辑SQL真实SQL主键重复问题创建Java-Maven项目 添加依赖 <properties><java.version>11</java.version><maven.compiler.source&…