首页 > 数据库 >MongoDB整理

MongoDB整理

时间:2023-05-11 20:47:58浏览次数:48  
标签:name MongoDB age db 文档 整理 数据库

MongoDB

一、数据库(database)

① 什么是数据库?

存储数据的仓库

②为什么要有数据库?

数据持久化

③数据库能做什么?

存储数据,可以通过网络访问

④数据库的分类

按照关系型分类:

1、关系型数据库(MySQL、Oracle等) 2、非关系型数据库(MongoDB、Redis)

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

  1. 数据存储方式。关系型数据库采用表格的形式来存储数据,数据之间通过主键、外键等进行关联;而非关系型数据库通常使用文档、键值对、图形等格式来存储数据,不需要遵循固定的数据模式。

  2. 数据处理方式。 关系型数据库采用 SQL 语言来进行数据操作和查询,具有事务支持和严格的一致性保证;而非关系型数据库则使用各种不同的查询语言和 API 进行数据操作,其数据一致性要求较低,但具有更好的扩展性和灵活性。

  3. 扩展性和性能。 关系型数据库通常使用垂直扩展来提高性能,即通过增加硬件资源(如 CPU、内存等)来提高系统性能,但这样成本较高。而非关系型数据库则采用水平扩展,即通过添加更多的服务器节点来提高性能,这种方式成本相对较低,同时也具有更好的可伸缩性。

  4. 数据安全性和稳定性。 关系型数据库通常采用 ACID 模型来保证数据的安全性和稳定性,但这会影响数据库的性能。而非关系型数据库则通常采用 BASE 模型,即基本可用、软状态、最终一致性模型来保证数据的稳定性和安全性,但这可能会牺牲一些数据的一致性。

二、MongoDB

①什么是MongoDB?

非关系型数据库。

②MongoDB的优点

  1. 高可扩展性。 MongoDB 采用分布式存储架构,支持水平扩展,即可以通过添加更多的服务器节点来提高系统性能和处理能力,这使得 MongoDB 能够轻松地应对数据量大、并发访问量高等需求。

  2. 灵活的数据模型。 MongoDB 的文档格式非常灵活,不需要遵循固定的数据模式,可以根据实际业务需求进行设计和调整,因此适合存储各种类型的数据,包括半结构化数据和非结构化数据等。可以快速开发web型应用,因为灵活,不用像关系型数据库一样需要建表。

  3. 查询性能高。 MongoDB 支持强大的查询功能,可以使用类似 SQL 的语言进行复杂的查询操作,同时也支持索引和聚合操作等,可以有效地提高查询效率和性能。

  4. 数据复制和容错。 MongoDB存储的是文档(document),文档内存储的是类似json的结构,所谓json就是字符串数组。MongoDB 提供了数据复制和容错机制,可以将数据副本保存在多个服务器上,当某个服务器出现故障时,系统可以自动切换到其他服务器上,保证系统的稳定性和可靠性。

  5. 方便的开发和维护。 MongoDB 的 API 简单易用,支持多种编程语言,如 Java、Python、C# 等,同时也提供了丰富的工具和管理界面,方便开发人员进行开发和维护。

三、MongoDB常见命令

①安装MongoDB

官网下载并安装,随后将bin文件设置成环境变量path的变量。设置完毕,则设置自动启动MongoDB数据库的方式。

教程:https://www.cnblogs.com/zhoulifeng/p/9429597.html

②MongoDB常见命令

开启服务器: net start MongoDB 关闭服务器: net stop MongoDB 打开客户端: mongo,在cmd窗口输入便可以连接上数据库

③MongoDB数据库结构

3.1、数据库(database):用来存储集合的,而且数据库也有分大小。

3.2、集合(collection):集合类似于数组,用于存放文档的

3.3、文档(document): 文档是MongoDB数据库中最小的单位,我们要操作的目标就是文档。 在这里插入图片描述

MongoDB关系: 数据库(database) > 集合(collection)> 文档(document)

注意: 在MongoDB中不需要自己创建数据库和集合,便可以直接创建文档,其实就是在创建文档的同时,会将数据库和集合创建了。

④操作MongoDB数据库

4.1、安装编辑器DataGrip,下列网站有魔法。

JETBRA.IN CHECKER | IPFS

4.2、最基础的代码: 在这里插入图片描述

4.3、对mongodb数据库的CRUD

官方文档: https://mongoosejs.com/

核心: 增: insert() 删: remove() 查: find() 改: update()

①增加

db.集合名.insert(document) 表示增加一个或多个文档

db.piyou.insert([
{name:"猪八戒", age: 38, address:"高老庄"},
{name: "沙和尚", age: 45, address:"流沙河"}
]);

注意: 传递的数据是数组,数组内部是对象,对象就相当于文档,插入了两个文档。

db.集合名.insertOne(document,[callback])表示插入一个文档,回调函数callback是可选的

db.piyou.insertOne({name:"唐僧", age: 18, address: "女儿国"});

表示向名为piyou的集合插入了一个文档。

db.集合名.insertMany(doucment, [callback]);表示插入多个文档

db.piyou.insertMany([
{name:"白骨精", age:20,address:"白骨洞"},
{name:"蜘蛛精", age: 24, address:"蜘蛛洞"}
]);

用法是和insert是相差不多的。数组里面有对象,对象即是文档。

②查找

查询插入的内容,便可调用查找的方法

db.集合名.find(condition);         //查询一个或多个文档 condition是查询条件
db.集合名.findOne(condition);   //查询一个文档
db.集合名.findMany(condition); //查询多个文档

以下是查询语句和查询结果,传入的值需要是json语句 查询语句和查询结果

db.piyou.find({age:18});    
//这条语句表示的是查询age是18的文档。 值得注意的是,条件也是写在了对象里面,
//传入的值需要是json语句

执行结果: 在这里插入图片描述 如果想要知道有多少个的时候,则可以使用

db.集合名.find(condition).count(); 使用count()来计数

db.piyou.find().count(); // 执行结果是: 6, 因为在插入那边是一共插入了6条数据

总结:find()返回的是数组,数组内存放着文档,findOne()返回的就是一个文档,findMany()返回的也是数组内存放着文档的形式。find()的返回值还可以调用count(),用来获取符合条件的数量。

③修改

db.集合名.update(condition,newObject);     修改一个或多个文档
db.集合名.uodateOne(condition,newObject); 修改一个文档
db.集合名.updateMany(condition, newObject); 修改多个文档
condition: 查询的条件 newObject: 需要修改的语句

在使用update()时,需要一个新的玩意加入,叫做修改操作符,一般长成:

    $set        表示需要设置指定的属性
$unset 表示需要删除指定的属性
$push 表示给数组添加一个新元素,因为文档内也会有数组,数组便会有数组元素
$addToset 表示给数组添加一个新元素,和push的区别是,如果同名,则不会再添加
$gt 大于
$gte 大于等于
$lt 小于
$lte 小于等于
$or [{条件一,条件二}] 表示或的意思,符合条件一或者条件二
$inc 表示自增,用在在原来数据的基础上对数据加减,可用于加薪减薪的操作

所以不能像下面这条语句这样使用,这样使用的话,会使用{age:18}覆盖掉{name:“猪八戒”…}这整条语句。

db.piyou.update({name:"猪八戒"}, {age:39});

执行结果,可以看到猪八戒这整条数据不见了,那么应该怎么操作呢?这时候修改操作符就派上用场了 在这里插入图片描述

db.piyou.update({name:"孙悟空"}, {$set:{age:29}});
/*
表示根据条件{name:"孙悟空"}, 找到了孙悟空的这个文档, 使用了$set(修改指定属性)
这个修改操作符,将age修改成了29
*/

执行结果: 在这里插入图片描述

db.piyou.update({name:"唐僧"}, {$unset:{address: 1}});
/*
表示使用 $unset(删除指定属性), 将唐僧的address的属性值给删掉了
*/

执行结果,唐僧的address的值已经被删除了。 在这里插入图片描述

④删除

db.集合名.remove(condition)		删除符合条件的一个或多个文档
db.集合名.deleteOne(condition) 删除符合条件的一个文档
db.集合名.deleteMany(condition) 删除符合条件的多个文档

db.piyou.remove({age: 39});
/*
表示删除了符合 age为39 这个条件的一个或多个文档。
也就是删掉了刚刚那个猪八戒的那条语句
*/

执行结果: 在这里插入图片描述

⑤练习

db.persons.insert([
{
name:"大大白",
age: 28,
hobby:{
music:['new Boy', '云烟成雨', '秋酿'],
games:['王者荣耀', '和平精英', '光遇']
}
},
{
name: "小白",
age: 21,
hobby:{
movies:['大话西游', '唐伯虎点秋香'],
games:['王者荣耀', '旅行青蛙', '穿越火线']
}
}
]);

解释:
向集合persons中插入一个数组,数组中有两个文档,文档内有一个hobby的文档,
这个hobby文档被称作内嵌文档,然后hobby文档内有两个数组。

需求一:查询喜欢玩 王者荣耀 的人

分析:王者荣耀是存在于hobby中的games
db.persons.find({"hobby.games":"王者荣耀"});
/*
这是需要注意的知识点:如果查询的是内嵌文档可以使用 . 的方式查询,
不过需要使用引号,这是因为mongodb的文档是json的缘故吧。
*/

需求二: 插入20000条数据

方式一:

for(let i = 1; i <= 20000; i++){
db.nums.insert({num:i});
}
/*
这种方式需要调用insert语句20000次,效率低下,那么可以只调用一次insert语句呢?
可以将数据先存储起来,然后一次性加入。
*/

方式二:

const arr = [];
for(let i = 1; i <= 20000; i++){
arr.push({num:i});
}
db.nums.insert(arr);
/*
这是将数据全部存到了数组中,随后再将数组插入,只执行了一次insert语句。
*/

拓展:

文档间的关系(三种)

①、一对一(one to one)

db.wife.insert([
{
name:"黄蓉",
age: 26,
handsband:{
name:"郭靖",
age: 38
}
},
{
name: "小兰",
age: 16,
handsband:{
name: "新一",
age: 16
}
}
]);
/*
内嵌文档,夫妻关系:一个妻子是对应一个丈夫的,这是使用内嵌文档来实现的。
*/

②、一对多(one to many)

-- 父母 - 孩子
-- 文章 - 评论
-- 内嵌文档也可以实现,就是一个文档内嵌多个文档,不过比较繁琐
-- 用户一个文档,订单一个文档,在使用的时候再一一对应

// 第一句是创建了两个用户, 分别是花木兰和诸葛亮
db.users.insert([{name:"花木兰"}, {name:"诸葛亮"}]);
// 这一句是查询用户内容, 这是需要知道用户的_id,从而在第三句加入
db.users.find();
// 这是生成了一个订单,并且user_id存储的是花木兰的id
db.orders.insert({list_name:["配马", "鞍鞯"], user_id: ObjectId("61374eac77393663e2de9bd3")})
// 再生成了一个订单,并且user_id存储的是花木兰的id
db.orders.insert({list_name:["蜜糖", "男装"], user_id: ObjectId("61374eac77393663e2de9bd3")})
// 在users里查找到 花木兰 这个用户的id,并将其存储起来
let userId = db.users.findOne({name:"花木兰"})._id;
// 使用id来查找
db.orders.find({user_id: userId});

③、多对多(many to many)

	-- 学生 - 老师
-- 商品 - 分类
-- 可以使用内嵌文档的形式完成

db.teas.insert([{name:"诸葛亮"}, {name:"龟仙人"}, {name:"唐僧"}]);
db.teas.find();
db.stus.insert([
{
name: "孙悟空",
// 插入的是 龟仙人和唐僧的id
teas_id:[ObjectId("6137552877393663e2de9bdb"), ObjectId("6137552877393663e2de9bdc")]
},
{
name: "刘禅",
// 插入的是 诸葛亮和龟仙人的id
teas_id:[ObjectId("6137552877393663e2de9bda"),ObjectId("6137552877393663e2de9bdb")]
}

]);

db.stus.find();

④投影(限制条件,显示效果)

首先先创建一个集合:

db.staff.insert([
{name:"小白", age: 18, salary: 3000},
{name:"大白", age: 19, salary: 3500},
{name:"熊大", age: 23, salary: 3200},
{name:"熊二", age: 22, salary: 3100},
{name:"光头强", age: 27, salary: 3400},
{name:"小鲤鱼", age: 17, salary: 1500},
{name:"奥特曼", age: 39, salary: 4500}
]);
/*
这样创建的是一个列表集合。
*/

需求一:按照薪资排列,可以使用sort()方法

	sort(condition)	
sort({salary: 1})表示按照薪资升序排列
sort({salary: -1})表示按照薪资降序排列

db.staff.find().sort({salary: 1});

排列结果: 在这里插入图片描述

db.staff.find().sort({salary: 1, age: -1});
/*
这句的含义是按照薪资升序排序,如果出现了相同的薪资的人,则按照年龄降序排序。
*/

limit() 限制 和skip() 跳过, 这两个方法经常可以一起使用,从而用来翻页。而且这两个方法是可以不分先后的。

db.staff.find().limit(2);
/*
表示只会显示前两个数据
*/

执行结果: 在这里插入图片描述

在查询时可以在find()中的第二个参数的位置传入 投影,
{name: 1, _id: 0}: 表示显示name属性,不显示_id属性。
12
db.staff.find({}, {name: 1, _id: 0, salary: 1});
/*
这句的含义是只显示 name和salary属性,不显示 _id属性
*/

执行结果: 在这里插入图片描述

 

标签:name,MongoDB,age,db,文档,整理,数据库
From: https://www.cnblogs.com/jzbc/p/17392175.html

相关文章

  • 最近VJ刷题整理
    BitsReverse题意:给出两个数,每次操作其中一个数,将其二进制位上连续的三个数翻转,求最小的操作次数Solution每次操作相当于交换了左右两个二进制位的数,所以一次操作只会改变奇数位/偶数位上的数,考虑到只用求最小的操作次数,我们可以将每个数的二进制位上的1所在的位置分奇偶存一下......
  • MongoDB表数据批量插入
    for(vari=200;i<210;i++){db.getCollection("tb_table").insert({"level":NumberInt(1),"appTuid":"20230210-151329-8759-19227","title":"自动化-0419-"+i,......
  • FastReport问题整理(转载)
    1.FastReport中如果访问报表中的对象?可以使用FindObject方法。TfrxMemoView(frxReport1.FindObject(’memo1′)).Text:=’FastReport’;2.FastReport中如何使用上下标?设置frxmemoview.AllowHTMLTags:=True;在Text输入如下上标:mm<sup>2</sup>下表:k<sub>6</sub>举一反三,你还可以......
  • MongoDB 创建索引
    索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。索引是特殊的数据结构,索引存储......
  • POE供电资料整理
    使用芯片TPS23861PWR供应商链接:https://item.szlcsc.com/94440.htmlTPS23861具有自主模式的2线对、2类、4通道PoEPSE官网链接:https://www.ti.com.cn/product/cn/TPS23861?qgpn=tps23861DataSheet:https://www.ti.com.cn/cn/lit/gpn/tps23861评估板页面TPS23861EVM-6......
  • Docker中部署mongodb
    1、拉取镜像dockerpullmongo:4.42、创建mongo数据持久化目录(防止容器被删数据库也被删了)mkdir-p/xx/xx/xx3、运行mongodbdockerrun-itd--namemongo-v/xx/xx/xx:/data/db-p27017:27017mongo:4.4--auth-v:将宿主机的/xx/xx/xx映射到容器的/data/db目录......
  • SpringMVC常用注解整理
    一、组件型注解:@Component在类定义之前添加@Component注解,他会被spring容器识别,并转为bean。@Repository对Dao实现类进行注解(特殊的@Component)@Service用于对业务逻辑层进行注解,(特殊的@Component)@Controller用于控制层注解,(特殊的@Component)以上四种注解都是......
  • linux上使用yum部署mongodb4.2+分片副本
    系统配置Linux是有文件句柄限制的,而且默认不是很高,一般都是1024,作为一台生产服务器,其实很容易就达到这个数量。为防止服务因toomanyopenfiles错误出现宕机,这里需要对linux系统句柄数进行调整。##临时调整,系统重启即失效ulimit-SHn65535##永久调整,编辑/etc/security/limi......
  • Oracle日期处理整理
    1.获取日期元素注意:1).hh24写法指24小时,Oracle默认是12小时2).分钟用mi,不要用mm,因为与之前的MM冲突1-12小时写法yyyyMMdd24miss(Oracle默认)1-24小时写法yyyyMMddHH24miss获取日期元素:selectto_char(sysdate,'yyyy-mm-ddhh24:mi:ss')fromdual;--日期转化为字......
  • Leetcode11~20题整理
    11.盛最多水的容器比较暴力的做法:classSolution{public:intmaxArea(vector<int>&h){vector<int>t;intn=h.size();intres=-1;for(inti=0;i<n;i++){for(intj=0;j<(int)t.size(......