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

news/2024/4/26 10:56:19/文章来源:https://blog.csdn.net/ks795820/article/details/129123224

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

  • 关系型数据库有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.luyixian.cn/news_show_72816.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IP地理位置定位技术原理是什么

IP地理位置定位技术的原理是基于IP地址的网络通信原理和基础上的。它利用IP地址所包含的一些信息,如网络前缀和地址段,以及ISP的IP地址归属地数据库,来推测IP地址所对应的地理位置。具体来说,IP地址是由32位二进制数字组成的&…

《计算机网络:自顶向下方法》实验2:常用网络命令的使用

使用Ping实用程序来测试计算机的网络连通性 登录到Windows中。单击开始,然后将鼠标指针移到程序上,再移到Windows系统,然后单击命令提示符。在命令提示窗口键入ping 127.0.0.1。问题1:发送了多少数据包?接受了多少数据包?丢失了多少数据包? 发送了4个数据包;接受了4个数…

Java集合(二)---Map

1.什么是Hash算法哈希算法是指把任意长度的二进制映射为固定长度的较小的二进制值,这个较小的二进制值叫做哈希值static final int hash(Object key) {int h;return (key null) ? 0 : (h key.hashCode()) ^ (h >>> 16);}以上是HashMap中的hash算法代码2…

机器学习------ 基于ubuntu 22.04 系统下的pytorch 安装记录过程(包含cuda和cudnn的安装)

机器学习----- pytorch的安装过程 最近,在学习机器学习,在对于理论方面进行一段时间的学习后,打算开始上手代码。在此之前,选择了pytorch作为学习的工具,这里记录下安装的过程。在这里,先把我的设备展示一…

java10-异常处理

1.异常处理体系结构 2.从程序执行过程看编译时异常和运行时异常 》编译时异常:执行javac.exe命令时,可能出现的异常 》运行时异常:执行java.exe命令时,出现的异常 3.常见的异常类型,请举例说明: Test …

PCL 平面拟合方法 对比

目录 一、最小二乘法 (Least Squares, LS) 二、采样一致性(Sample Consensus)方法 2.1 pcl::LeastMedianSquares (LMedS) 2.2 pcl::RandomSampleConsensus (RANSAC) 2.3 pcl::MEstimatorSampleConsensus (MSAC) 2.4 pcl::RandomizedRandomSampleCo…

解决Ubuntu22.04.1上安装ch34x串口驱动报 Key was rejected by service 需要签名的问题

解决Ubuntu22.04.1上安装ch34x串口驱动报 Key was rejected by service 需要签名的问题问题官网下载解压驱动包编译安装给驱动签名再来载入模块(设备驱动程序)问题 Ubuntu22.04.1 Linux版本5.19.0-32-generic 运行Qt串口通信 m_serialPort->open(QIO…

数组类模板

要求:设计一个数组模板类(MyArray),完成对不同类型元素的管理操作步骤设计头文件在 qtcreate下先创建03_code的项目,然后右键点击03_code添加新文件,点击头文件,点击Choose命名为 myarry.hpp&am…

[黑马程序员SSM框架教程]03 spring核心概念

IOC/DI 书写现状:耦合度偏高 如图:传统书写代码左边业务层需要new一个对象进行业务实现。当数据层优化代码BookDaoImpl2就需要动业务层代码重新修改new的对象。导致代码耦合度偏高。 解决办法:使用对象,不要主动new对象&#xff…

设计模式.工厂模式.黑马跟学笔记

设计模式.工厂模式4.创建型模式4.2 工厂模式4.2.1 概述4.2.2 简单工厂模式4.2.2.1 结构4.2.2.2 实现4.2.2.4 优缺点4.2.2.3 扩展4.2.3 工厂方法模式4.2.3.1 概念4.2.3.2 结构4.2.3.3 实现4.2.3.4 优缺点4.2.4 抽象工厂模式4.2.4.1 概念4.2.4.2 结构4.2.4.2 实现4.2.4.3 优缺点4…

关于java8的List的stream流的foreach()方法问题探究(坑)与替代方案

一、起因 今天发现线上系统出现了一个bug&#xff0c; 我有一个“定时任务”每天凌晨触发&#xff0c;任务内容&#xff1a; ① 定时调用的系统暴漏的接口&#xff0c;来定时获取List<Object>数据。 ② 然后我会筛选出该List中符合条件的Object&#xff0c;对筛选出来的…

【Python入门第十五天】Python字典

字典&#xff08;Dictionary&#xff09; 字典是一个无序、可变和有索引的集合。在 Python 中&#xff0c;字典用花括号编写&#xff0c;拥有键和值。 实例 创建并打印字典&#xff1a; thisdict {"brand": "Porsche","model": "911&q…

科技新浪推前浪 ChatGPT将元宇宙“拍在沙滩上”?

近期ChatGPT的热度显然已经盖过了元宇宙&#xff0c;回想去年元宇宙大热之际&#xff0c;很多企业纷纷跟进&#xff0c;甚至还有不少公司选择更名以表达All In元宇宙的决心。而如今ChatGPT抢占风头&#xff0c;成为新宠&#xff0c;元宇宙似乎被“抛弃”了&#xff0c;难道元宇…

【React npm】从零搭建react脚手架,发布组件库到npm,并实现按需加载(二)

发布react组件库前情回顾介绍搭建脚手架配置babelrc配置jsconfig写入组件demo修改主入口文件配置生产环境webpack配置package.json发布实现按需加载前情回顾 前面写过一篇&#xff0c;发布单个组件到npm的&#xff1a; https://blog.csdn.net/tuzi007a/article/details/12911…

【HTML】HTML 表单 ⑤ ( form 表单域 )

文章目录一、form 表单域1、form 表单域作用2、form 表单域语法3、form 表单域 Get 请求4、form 表单域 Post 请求一、form 表单域 1、form 表单域作用 从 input 表单 , textarea 文本域 , select 下拉菜单 中收集了用户信息 , 需要通过 form 表单域 发送给 服务器端 ; 2、fo…

第十一章 - 模糊匹配(like)、正则匹配(REGEXP)、文本处理函数、时间处理函数

第十一章 - 模糊匹配&#xff08;like&#xff09;、正则匹配&#xff08;REGEXP&#xff09;、文本处理函数、时间处理函数模糊匹配和正则匹配like%通配符_通配符REGEXP 正则匹配文本拼接concat&#xff08;&#xff09;substring()substring_index()一些文本处理函数时间处理…

【计算机组成原理】求寻址范围(按字/按字节)

今天一道计算机组成原理的复习题一直没搞懂怎么做的&#xff0c;网上讲解求寻址范围题型的资料和视频也很少&#xff0c;花了半个晚上才搞懂。 首先&#xff0c;理解存储体&#xff0c;存储单元&#xff0c;存储字&#xff0c;存储元。&#xff08;文章末尾详细解释了) 以下是…

2022年休闲游戏市场总结

在预测 2023 年之前&#xff0c;我们先回顾一下 2022 年。从上一年发生的事件中往往能看到未来趋势的影子&#xff0c;所以 2022 年的总结至关重要。一、2022年总结回顾1、流行游戏类型回顾 2022 年&#xff0c;三种超休闲游戏表现最为突出&#xff1a;跑酷游戏&#xff1a;跑酷…

你知道IT运维的本质是什么吗?

大家好&#xff0c;我是技福的小咖老师。 之前看到个文章&#xff0c;说运维的本质是“可视化”&#xff0c;甚至还有人说是DevOps。不可否认&#xff0c;“可视化”是运维过程中非常重要的一个环节&#xff1b;DevOps则是开发运维一体化非常重要的工具。 究其根本&#xff0…

leetcode重点题目分类别记录(一)数据结构类

算法题分类别记录数组排序归并排序合并两有序数组归并排序快速排序荷兰旗问题快速排序堆排序基数排序滑动窗口/双指针N数之和四数相加链表环形链表重排链表LRU缓存栈与队列栈实现队列/队列实现栈最小栈/最小队列单调队列单调栈哈希表字符串字符串处理字符串匹配KMP子串二叉树二…