MongoDB上手教程:环境安装、图形化应用、增删改查、mongoose

本文主要是介绍MongoDB上手教程:环境安装、图形化应用、增删改查、mongoose,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、简介及准备工作
    • 1.数据库的分类
    • 2.MongoDB简介
    • 3.下载安装(centos)
    • 4.shell基本操作
  • 二、图形化应用
    • 1.远程访问
    • 2.基本操作
    • 3.查询
  • 三、增删改查
    • 1.数据库crud基本操作
      • (1)创建并使用数据库
      • (2)查询
      • (3)删除数据库
    • 2.集合crud基本操作
      • (1)创建集合
      • (2)查询集合
      • (3)删除集合
    • 3.文档crud基本操作
      • (1)插入文档
      • (2)查询文档
      • (3)更新操作
      • (4)删除操作
      • (3)聚合操作
  • 四、mongoose
    • 1.基本用法
    • 2.文档的增删改查

参考:

尚硅谷教程:这里
mongodb官方文档:这里
参考博客1:这里
参考博客2:这里

一、简介及准备工作

1.数据库的分类

按照是否是关系型,可分为:

关系型数据库(MySQL、Orcal等)
非关系型数据库(MongoDB等)

二者区别:

关系型的是创建表格,非关系型是可以创建任意多个文档。

  • ①数据存储方式不同

关系型和非关系型数据库的主要差异是数据存储的方式。关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。

与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。

  • ②扩展方式不同

SQL和NoSQL数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展。
要支持更多并发量,SQL数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了。

因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都需要通过提高计算机性能来客服。虽然SQL数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限。而NoSQL数据库是横向扩展的。

而非关系型数据存储天然就是分布式的,NoSQL数据库的扩展可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载。

  • ③对事务性的支持不同

如果数据操作需要高事务性或者复杂数据查询需要控制执行计划,那么传统的SQL数据库从性能和稳定性方面考虑是你的最佳选择。SQL数据库支持对事务原子性细粒度控制,并且易于回滚事务。

2.MongoDB简介

MongoDB是为快速开发互联网Web应用而设计的数据库系统。

设计目标: 极简、灵活、作为web应用栈的一部分。

数据模型: 是面向文档的,所谓的文档是一种类似于JSON的结构(增强版的JSON——BSON)。

—三个重要概念—

数据库(mongodb): 是一个仓库,可以存放集合。

集合(collection): 类似于数组,集合中可以存放文档。相当于关系型数据库中的表。

文档(document): 是数据库中的最小单位,我们存储和操作的内容都是文档。

数据库里放集合,集合里放文档,我们操作的就是文档:

在这里插入图片描述

—注意—

在mongodb中,数据库和集合都不需要手动创建。我们在创建文档时,如果文档所在的文档或数据库不存在,则会自动创建数据库和集合(在第一次插入文档时创建)。

3.下载安装(centos)

教程跳转:点击这里

4.shell基本操作

  • 进入mongodb shell:
在任意位置打开终端,输入mongo并回车。

以下所有命令,均在mongodb shell中执行。

  • 显示所有的数据库:
show dbs
或 show databases
  • 进入某个数据库:
use 数据库名
  • 查看当前所在数据库:
db
  • 在数据库中查看有哪些集合:
show collections
或show tables
  • 删除数据库中的集合:
db.集合名.drop()

二、图形化应用

mongodb manager下载地址:https://www.mongodbmanager.com/download-mongodb-manager-free

下载后双击安装包,傻瓜式操作就能安装好。

1.远程访问

远程访问服务器中的mongodb:

1 点击 server>new mongodb connection
2 输入ip和port(port可以通过查看配置文件获取)
3 点击test connection测试能否成功连接
4 点击OK连接

2.基本操作

在这里插入图片描述

在左侧窗口可以进行数据库/集合的增删改查的操作,在右侧窗口可以进行文档的增删改查的操作,非常方便。

3.查询

点击小黑图标,可以在右侧窗口进行查询操作,可以在script窗口中输入任何指令并执行,查询结果将显示在下方窗口中。

在这里插入图片描述

执行整个脚本、一行脚本、选中的脚本:

在这里插入图片描述

对于执行结果可以显示为shell形式(点击Output)、表格形式(点击Documents View):

在这里插入图片描述

三、增删改查

在进行操作之前,请务必学习上面的mongodb简介部分的内容。

1.数据库crud基本操作

(1)创建并使用数据库

  • 语法:
# 如果数据库不存在,则创建并切换到该数据库,存在则直接切换到指定数据库
use 数据库名
  • 示例:
# 在script窗口中输入指令后执行,下方将返回执行结果
use test

在这里插入图片描述

(2)查询

  • 查看所有数据库
show dbs
或show databases
  • 查看当前所在数据库
db

(3)删除数据库

use 数据库名 #切换到数据库
db,dropDatabase() #删除当前库

2.集合crud基本操作

(1)创建集合

# step1:选择所在数据库
use test# step2:当第一个文档插入时,集合就会被创建并包含该文档
db.student.insert({'a':1})

(2)查询集合

  • 查询当前数据库中的所有集合
show collections
或show tables

(3)删除集合

db.集合名.drop()

3.文档crud基本操作

(1)插入文档

  • 插入一条文档:
db.集合名.insert(文档内容)
db.集合名.insertOne(文档内容)# 示例
db.student.insert({name:"团团",age:1,gender:"female"})
  • 插入多条文档:
db.集合名.insertMany([
文档1,
文档2,
...
])# 注意,每条文档必须换行写db.student.insertMany([
{name:"坨坨",age:1,gender:"female"},
{name:"钩子",age:1,gender:"female"}
])

(2)查询文档

  • 查询集合中的所有文档:
db.集合名.find()
  • 比较运算:
#1.select * from test.student where id = 1
db.student.find({"_id":1})
#2.select * from test.student where id != 1
db.student.find({"_id":{"$ne":1}})
#3.select * from test.student where id > 1
db.student.find({"_id":{"$gt":1}})
#4.select * from test.student where age < 1
db.student.find({"age":{"$lt":1}})
#5.select * from test.student where id >= 1
db.student.find({"_id":{"$gte":1}})
#6.select * from test.student where id <= 1
db.student.find({"_id":{"$lte":1}})
  • 逻辑运算:
# 1.and 直接用逗号分隔多个条件#select * from test.student where id >=3 and id <=4;
db.student.find({"_id":{"$gte":3,"$lte":4}})
#select * from test.student where id >=3 and id <=4 and age >=40;
db.student.find({"_id":{"$gte":3,"$lte":4},"age":{"$gte":40}
})
# 2.and 使用"$and"#select * from test.student where id >=3 and id <=4 and age >=40;
db.student.find({"$and":[
{"_id":{"$gte":3,"$lte":4}},
{"age":{"$gte":40}}
]})
# 3.or#select * from test.student where id >=0 and id <=1 or id >=4 or name = "团团";
db.student.find({"$or":[
{"_id":{"$lte":1,"$gte":0}},
{"_id":{"$gte":4}},
{"name":"团团"}
]})
# 4.求余#select * from test.student where id % 2 = 1;
db.student.find({"_id":{"$mod":[2,1]}})
#5.not#select * from test.student where id % 2 != 1;
db.student.find({"_id":{"$not":{"$mod":[2,1]}}
})
  • 成员运算:
# in
#select * from test.student where age in (20,30,31);
db.student.find({"age":{"$in":[20,30,31]}})# not in
#select * from test.student where name not in ('alex','yuanhao');
db.student.find({"name":{"$nin":['Stefan','Damon']}})
  • 正则:
# MongoDB: /正则表达/i#select * from test.student where name regexp '^j.*?(g|n)$';
db.student.find({'name':/^j.*?(g|n)$/i})#匹配规则:j开头、g或n结尾,不区分大小写
  • 查看指定字段:
# 0表示不显示,1表示显示
#select name,age from test.student where id=3;
db.student.find({'_id':3},{'_id':0,'name':1,'age':1})
  • 数组查询:
#查hobbies中有dancing的人
db.user.find({"hobbies":"dancing"
})
#查看既有dancing爱好又有tea爱好的人
db.user.find({"hobbies":{"$all":["dancing","tea"]}
})
#查看第2个爱好为dancing的人
db.user.find({"hobbies.2":"dancing"
})
#查看所有人的第2个到第3个爱好
db.user.find(
{},
{"_id":0,"name":0,"age":0,"addr":0,"hobbies":{"$slice":[1,2]},
}
)#查看所有人最后两个爱好,第一个{}表示查询条件为所有,第二个是显示条件
db.user.find(
{},
{"_id":0,"name":0,"age":0,"addr":0,"hobbies":{"$slice":-2},
}
)#查询子文档有"country":"China"的人
db.user.find(
{"addr.country":"China"
}
)
  • 排序:
# 1代表升序,-1代表降序
db.user.find().sort({"name":1,})
db.user.find().sort({"age":-1,'_id':1})
  • 分页:
# limit表示取多少个document,skip代表跳过几个document
db.user.find().limit(2).skip(0)#前两个
db.user.find().limit(2).skip(2)#第三个和第四个
db.user.find().limit(2).skip(4)#第五个和第六个
  • count():
#查询年龄大于30的人数
#方式一:
db.user.count({'age':{"$gt":30}}) #方式二:
db.user.find({'age':{"$gt":30}}).count()
  • 去重:
db.user.find().distinct()
  • null:
# 得到的是b这个key的值为null和没有b这个key的文档
db.user.find({"b":null})

(3)更新操作

  • 常规更新:
db.集合名.update(<query>,<update>,{upsert: <boolean>,multi: <boolean>,writeConcern: <document>}
)# 参数说明
query : 相当于where条件。
update : update的对象和一些更新的操作符。
upsert : 可选,默认为false,代表如果不存在update的记录则不更新也不插入,设置为true代表不存在则添加。
multi : 可选,默认为false,代表只更新找到的第一条记录,设为true,代表更新找到的全部记录。
writeConcern :可选,抛出异常的级别。
# 原始文档数据
{"name" : "钩子", "age" : 1, "gender" : "female"}# 1.覆盖式修改
db.student.update({"name":"钩子"},{"age":16,"name":"芒果"}
)
得到的结果为{"age":16,"name":"芒果"}# 2.局部修改:$set
db.student.update({"name":"钩子"},{"$set":{"age":15,"name":"苹果"}}
)
得到的结果为{"name" : "苹果", "age" : 15, "gender" : "female"}# 3.改多条:将multi参数设为true
db.student.update({"name":"钩子"},{"age":16,"name":"芒果"},{"multi":true}
)# 4.有则修改,无则添加:upsert参数设为true
db.student.update({"name":"钩子"},{"age":16,"name":"芒果"},{"upsert":true}
)# 5.删除字段:不要gender了
db.student.update({"name":"钩子"},{"$unset":{"gender":""}}
)

(4)删除操作

# 1.删除符合条件的第一个文档
db.student.deleteOne({ 'gender': "female" })# 2.删除符合条件的全部
db.student.deleteMany({"_id":{"$gte":3}})#删除id大于等于3的所有# 3.删除所有
db.student.deleteMany({}) #清空该集合
  • 加减操作:
#增加和减少$inc#年龄都+1
db.user.update({},{"$inc":{"age":1}},{"multi":true}
)#年龄都-10
db.user.update({},{"$inc":{"age":-10}},{"multi":true}
)
  • 添加删除数组内元祖:
# $push的功能是往现有数组内添加元素#为名字为武大郎的人添加一个爱好read
db.user.update({"name":"武大郎"},{"$push":{"hobbies":"read"}})#为名字为武大郎的人一次添加多个爱好tea,dancing
db.user.update({"name":"武大郎"},{"$push":{"hobbies":{"$each":["tea","dancing"]}
}})
# $pop的功能是按照位置只能从头或从尾即两端删元素,类似于队列。1代表尾,-1代表头#{"$pop":{"key":1}} 从数组末尾删除一个元素db.user.update({"name":"武大郎"},{"$pop":{"hobbies":1}
})#{"$pop":{"key":-1}} 从头部删除
db.user.update({"name":"武大郎"},{"$pop":{"hobbies":-1}
})
# $pull可以自定义条件删除db.user.update({'addr.country':"China"},{"$pull":{"hobbies":"read"}
},
{"multi":true
}
)

(3)聚合操作

关于$match $group $avg $project $concat参考博客:这里

四、mongoose

mongose就是一个Node.js的库,用来操作mongodb。

  • 三个对象:
Schema(模式对象):定义了约束mongodb的文档结构的条件。
Model:相当于mongodb中的 collection(集合)。
Document:表示集合中的具体文档。
  • nodejs安装mongoose模块:
npm i mongoose --save

1.基本用法

// 1、引入 mongoose 模块
const mongoose = require('mongoose');// 2、连接数据库    27017是默认端口号,可以省略不写, ppxia是需要连接的数据库
mongoose.connect('mongodb://127.0.0.1:27017/ppxia');// 2.1、这是对数据库的监听,而且是使用once, 只监听一次就行了
mongoose.connection.once('open', (err)=>{if(!err){console.log("数据库已连接...");}
});mongoose.connection.once('close', (err)=>{if(!err){console.log("数据库已断开!!!");}
});// 3、重命名,简化操作
const Schema = mongoose.Schema;// 3.1、创建了约束条件:type是类型,default是默认是女,如果是女的话则不用写性别这个属性值了。
const stuSch = new Schema({name:String,age: Number,gender: {type: String,default:"女"},address:String
});// 4、创建了 模型, 数据库中的集合名是 stuSch(会自动加s), 第二个参数是标准,即是约束条件: stuSch
const stuModel = mongoose.model('stuSch', stuSch);// 5、使用模型创建对象, 当想创建多个的时候,可以使用数组里面存储对象的方式
stuModel.create({name: "西施",age: 18,address: "王者峡谷"
}, (err)=>{console.log('文档创建成功~');
});

2.文档的增删改查

  • 增:
Model.create(doc,[callback]);			创建一个或多个对象
Model.createOne(doc, [callback]);		创建一个对象
Model.createMany(doc, [callback]);		创建多个对象-doc是需要插入的文档-callback(err) 是回调函数,可以用来提示是否创建成功了
  • 删:
Model.remove(condition, [callback]);
Model.deleteOne(condition, [callback]);
Model.deleteMany(condition, [callback]);-- condition 条件
  • 改:
Model.updateMany(condition, doc, [options], [callback]);
Model.updateOne(condition, doc, [options], callback);** Model.update() 已经不适用了
-- condition 修改的条件
-- doc 修改后的内容/需要修改的内容需要配合修改操作符来使用:$set		表示需要设置指定的属性$unset		表示需要删除指定的属性$push		表示给数组添加一个新元素,因为文档内也会有数组,数组便会有数组元素$addToset 	表示给数组添加一个新元素,和push的区别是,如果出现同名的数组元素,则不会再添加$gt			大于$gte		大于等于$lt			小于$lte		小于等于$or [{条件一,条件二}]		表示或的意思,符合条件一或者条件二	$inc		表示自增,用在在原来数据的基础上对数据加减,可用于加薪减薪的操作
  • 查:
Model.find(condition, 投影, [options], [callback]);	 	查询一个或多个文档-- 返回的是数组
Model.findById(id, 投影, [callback]);  			根据id查询一个文档
Model.findMany(condition, 投影. [callback]); 	查询多个文档
Model.findOne(condition, [projection], [options], [callback]);	查询一个文档-- condition 			查询条件-- 投影/ projection: 	投影,也就是 查询条件,有两种方式{name: 1, _id:0}: 1是显示,0是不显示	"name  -_id"显示name, 不显示 _id-- options:  	查询的选项, skip是跳过,limit是限制 {skip: 3, limit:3}-- callback: 	回调函数,有两个参数(err, doc) err是错误类型, doc是文档。
  • Document的方法:

Document事实上是Model的实例,对应mongodb中的文档。

document.get(name)获取指定属性值doc.get("name") === doc.name
document.set("name", "猪猪") === doc.name = "猪猪"
documentc.id  属性, 获取id
document.toJSON()- 转换成 JSON
document.toObject()将doc对象 转换成 普通JS对象, 转换后, 所有doc的属性和方法都不能使用了

这篇关于MongoDB上手教程:环境安装、图形化应用、增删改查、mongoose的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/922521

相关文章

Spring Boot整合Redis注解实现增删改查功能(Redis注解使用)

《SpringBoot整合Redis注解实现增删改查功能(Redis注解使用)》文章介绍了如何使用SpringBoot整合Redis注解实现增删改查功能,包括配置、实体类、Repository、Se... 目录配置Redis连接定义实体类创建Repository接口增删改查操作示例插入数据查询数据删除数据更

win10安装及配置Gradle全过程

《win10安装及配置Gradle全过程》本文详细介绍了Gradle的下载、安装、环境变量配置以及如何修改本地仓库位置,通过这些步骤,用户可以成功安装并配置Gradle,以便进行项目构建... 目录一、Gradle下载1.1、Gradle下载地址1.2、Gradle下载步骤二、Gradle安装步骤2.1、安

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

全网最全Tomcat完全卸载重装教程小结

《全网最全Tomcat完全卸载重装教程小结》windows系统卸载Tomcat重新通过ZIP方式安装Tomcat,优点是灵活可控,适合开发者自定义配置,手动配置环境变量后,可通过命令行快速启动和管理... 目录一、完全卸载Tomcat1. 停止Tomcat服务2. 通过控制面板卸载3. 手动删除残留文件4.

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Python的pandas库基础知识超详细教程

《Python的pandas库基础知识超详细教程》Pandas是Python数据处理核心库,提供Series和DataFrame结构,支持CSV/Excel/SQL等数据源导入及清洗、合并、统计等功能... 目录一、配置环境二、序列和数据表2.1 初始化2.2  获取数值2.3 获取索引2.4 索引取内容2

python依赖管理工具UV的安装和使用教程

《python依赖管理工具UV的安装和使用教程》UV是一个用Rust编写的Python包安装和依赖管理工具,比传统工具(如pip)有着更快、更高效的体验,:本文主要介绍python依赖管理工具UV... 目录前言一、命令安装uv二、手动编译安装2.1在archlinux安装uv的依赖工具2.2从github

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

C#实现SHP文件读取与地图显示的完整教程

《C#实现SHP文件读取与地图显示的完整教程》在地理信息系统(GIS)开发中,SHP文件是一种常见的矢量数据格式,本文将详细介绍如何使用C#读取SHP文件并实现地图显示功能,包括坐标转换、图形渲染、平... 目录概述功能特点核心代码解析1. 文件读取与初始化2. 坐标转换3. 图形绘制4. 地图交互功能缩放