MongoDB (操作数据库,操作集合,操作文档)的笔记
https://www.bilibili.com/video/BV1gV411H7jN/?spm_id_from=333.999.0.0&vd_source=92305fa48ea41cb7bedb3ab5e056d42d
b站mongodb的视频链接。
1,MongoDB是什么?


2,MongoDB和Redis的区别
2.1,内存管理机制

2.2,支持的数据结构

2.3,不适用场景

3,可视化工具 Robomongo
mongodb的安装和下载,我是自己在网上搜的下的,忘记在哪下的了。
打开命令: mongod ,要输入数据库命令的话,命令是:mongo


然后就可以输入数据库命令了

我在网页上下载的。连好数据库就是下图。

4,MongoDB数据库的基本操作

4.1,操作数据库
4.1.1,创建数据库

有数据的数据库会被显示出来,这里 sxt 只是被创建出来了,db可以知道当前所在的数据库。

4.1.2,查询数据库

往sxt 数据库插入数据,再去show dbs,就发现有sxt了。

在可视化工具 robo 里也可以看到


4.1.3,删除数据库


4.2,操作集合
4.2.1,创建集合(相当于mysql的表)

集合名和数据库名别重名,因为你删集合,有可能把库删了。下图是在数据库 sxt 里 创建 shsxt 的集合。

查看可视化工具

所以上面的知道就好,不需要创建集合,下图的才是要用的。

4.2.2,删除集合

比如,删除shsxt 这个集合

查看可视化工具,发现也没有数据库 sxt 了,是因为 数据库sxt只有shsxt这一个集合,删了shsxt集合后,数据库sxt就没有数据了,也就显示不出来了,但是sxt还在。


4.3,操作文档
4.3.1,插入文档
4.3.1.1,insert

在可视化工具里输入以下内容
use sxt
user0 = {
"name":"zhangsan",
"age":18,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"BJ"
}
} db.user.insert(user0)
可视化工具里也能看到插入的信息。

注:_id 字段,这个值必须在user集合中唯一,若不指定主键值,会自动分配一个值。
4.3.1.2,save

用save() 插入user1,指定_id 为2,看可视化工具,发现把 _id 已经改为2了,
user1 = {
"_id":2,
"name":"zhangsan",
"age":18,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"BJ"
}
}
db.user.save(user1)

用save()也能实现修改,把name改成wangwu,查看robo

4.3.1.3,批量插入,insertMany
批量插入user1,user2,user3,user4,user5,我先把数据库的user集合删了,这样好看一点。
user1 = {
"_id":1,
"name":"zhangsan",
"age":1,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"BJ"
}
}
user2 = {
"_id":2,
"name":"lisi",
"age":2,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"SH"
}
}
user3 = {
"_id":3,
"name":"wangwu",
"age":3,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"GZ"
}
}
user4 = {
"_id":4,
"name":"zhaoliu",
"age":4,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"SZ"
}
}
user5 = {
"_id":5,
"name":"tianqi",
"age":5,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"TY"
}
}
db.user.insertMany([user1, user2, user3, user4, user5])
查看robo ,发现都插入了。

4.3.2,更新文档


把 name 为 lisi 的人 改成 user2,就是name和age变了,其他的没变。
user2 = {
"name":"wangwu",
"age":20,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"BJ"
}
}
db.user.update({"name":"lisi"},user2)
在robo发现,确实改了。

注:比如修改的值只有name,age其余属性会被删除,所以改的话,要把原来的数据也加上。
如果把 _id 为2 的人改成 user2,就是把name改成 lisi,(注意看user2 和之前的user2不一样了,没有hobbies和addr)。
user2 = {
"name":"lisi",
"age":20,
}
db.user.update({"_id":2},user2)
robo里 _id为2,但是没有被修改的数据(和之前的user2相比,前提如果是我们想要没有被修改的数据存在)不见了,被删除了

4.3.2.1,再来试一下修改多条数据

我们可以插入一个user6,让user6的name为wangwu。
user6 = {
"name":"wangwu",
"age":20,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"BJ"
}
}
db.user.insert(user6)

把user集合里所有name为wangwu的人改成 wangwu666(multi 为 true),其它没有被修改的数据存在。如果不存在name为wangwu的人,就插入新的(upsert 为 true)。
改之前的

multi必须配合$符号一起使用,否则会无效
$set修改器
$set用来指定一个键的值,如果这个键不存在,则创建它。键可以不加双引号。
db.user.update({"name":"wangwu"},{"$set":{"name":"wangwu666"}},{"upsert":true, "multi":true})
下图显示已经修改。

还可以用 updateMany
db.user.updateMany({"name":"wangwu"},{$set:{"name":"wangwu666"}})
4.3.2.2,增加和减少 $inc
$inc :将 集合中文档的字段的值增加或减少某个值
我们先把user集合删了(我是在robo里手动删的),重新插入一些数据。
user1 = {
"_id":1,
"name":"zhangsan",
"age":1,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"BJ"
}
}
user2 = {
"_id":2,
"name":"lisi",
"age":2,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"SH"
}
}
user3 = {
"_id":3,
"name":"wangwu",
"age":3,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"GZ"
}
}
user4 = {
"_id":4,
"name":"zhaoliu",
"age":4,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"SZ"
}
}
user5 = {
"_id":5,
"name":"tianqi",
"age":5,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"TY"
}
}
db.user.insertMany([user1, user2, user3, user4, user5])


年龄都减1,其中,{} 表示对集合中所有文档进行操作,同时 multi 为 true。
注意:要选中执行。
db.user.update(
{},
{$inc: {"age":-1}},
{"multi":true}
)

年龄都加10,其中,{} 表示对集合中所有文档进行操作,同时 multi 为 true。
db.user.update(
{},
{$inc: {"age":10}},
{"multi":true}
)

4.3.3,删除文档

删除集合中name为 lisi 的人,只删符合条件的第一个文档(justOne 为 true)
db.user.remove({"name":"lisi"},{justOne:true})


这里自己可以一删。
db.user.remove({})
4.3.4,查询文档

db.user.find()

db.user.distinct("name")

4.3.4.1,比较运算(=,!= $ne,> $gt,< $lt,>= $gte,<= $lte)

查 _id 等于3,这个直接查就行
db.user.find({"_id":3})

查 _id 不等于3,用 $ne,!=
db.user.find({"_id":{$ne:3}})

查 _id 大于3,用 $gt,>
db.user.find({"_id":{$gt:3}})

查 _id 小于3,用 $lt,<
db.user.find({"_id":{$lt:3}})

查 _id 大于等于3,用 $gte,>=
db.user.find({"_id":{$gte:3}})

查 _id 小于等于3,用 $lte,<=
db.user.find({"_id":{$lte:3}})

4.3.4.2,逻辑运算($and,$or,$not,且或非,$mod 取余)

查询 _id 大于等于3,小于等于4,这个不用$and,用的是 {"$gte":3, "$lte":4} 中间的 逗号,也表示 and关系。
db.user.find({"_id":{"$gte":3, "$lte":4}})

查询 _id 大于等于3,小于等于4, age 大于等于4。注意格式,find里面是 {} 的文档。
第一种方式:
db.user.find({
"_id":{"$gte":3, "$lte":4},
"age":{"$gte":4}
})
第二种方式(用$and):
db.user.find({
"$and":[
{"_id":{"$gte":3, "$lte":4}},
{"age":{"$gte":4}}
]
})


查询 _id 大于等于0,小于等于1,或者,_id大于等于4,或者,name为 tianqi (用$or)
db.user.find({
"$or": [
{"id":{"$gte":0, "$lte":1}},
{"id":{"gte":4}},
{"name":"tianqi"}
]
})


查询 _id 取余2为1 (用 $mod)
db.user.find({
"_id":{
"$mod":[2,1]
}
})

查询 _id 取余2为1,再取反 (用 $not)
db.user.find({
"_id":{
"$not":{
"$mod": [2,1]
}
}
})

4.3.4.3,成员运算($in,$nin)

查询 age 在 1,2,3之间
db.user.find({
"age":{
"$in":[1,2,3]
}
})

查询 age 不在 1,2,3之间
db.user.find({
"age":{
"$nin":[1,2,3]
}
})

4.3.4.4,type操作符($type)


查询 name 是字符串类型的数据,从表里看到字符串类型 String 对应的数字是 2,所以 $type :2,pretty方法是为了格式化输出结果,就是易读。
db.user.find({
"name":{
"$type":2
}
}).pretty()

4.3.4.5,正则表达式
可以看这个文章 https://m.runoob.com/mongodb/mongodb-regular-expression.html
4.3.4.6,投影(0是隐藏,1是显示)

让_id 为3的人 的 _id 不显示出来,name 和 age显示出来。
db.user.find(
{"_id":3},
{"_id":0, "name": 1, "age":1}
)

4.3.4.7,查数组里的数据($all,. 下标 ,$slice,嵌入文档)

查询hobbies中有read的人
db.user.find({
"hobbies":"read"
})
这里我没展开截屏,太长了,看第一个的也可以

查询hobbies既有read又有music的人 (用 $all)
db.user.find({
"hobbies":{
"$all":["read", "music"]
}
})

查询第2个爱好为read的人(下标从0开始),结果和上图一样。
db.user.find({
"hobbies.1":"read"
})

只查看所有人的第1个到第2个爱好(用到了切片 $slice),也就是把 _id,name,age,addr 这些隐藏起来(用到了 投影 )
db.user.find(
{},
{
"_id":0,
"name":0,
"age":0,
"addr":0,
"hobbies":{"$slice":[0,1]},
})


只查看 所有人的最后两个爱好,最后两个用切片表示就是 $slice:-2
db.user.find(
{},
{
"_id":0,
"name":0,
"age":0,
"addr":0,
"hobbies":{"$slice":-2},
}
)


先看一下刚开始插入的文档,发现 "country":"China" 是嵌入文档。
user6 = {
"name":"wangwu",
"age":20,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"BJ"
}
}
查询子文档(嵌入文档)有 "country":"China" 的人
db.user.find(
{
"addr.country":"China"
}
)

4.3.4.8,排序(sort(),1是升序,-1是降序)

按姓名升序查询
db.user.find().sort({"name":1})

4.3.4.9,分页(limit(),skip() )

取2个,跳过0个。
db.user.find().limit(2).skip(0)

同理,可以继续取2个,跳过2个
db.user.find().limit(2).skip(2)
综上,用 pageSize 表示 取几个数据,pageNum 表示 第几页,那跳过几个就可以用 pageSize * (pageNum - 1) 表示(看上面黑色背景图的规律)。
4.3.4.10,统计 ($gt 和 count() )

查询 _id 大于3的人数
db.user.find({_id:{"$gt":3}}).count()

MongoDB (操作数据库,操作集合,操作文档)的笔记的更多相关文章
- MongoDB数据库、集合、文档的操作
MongoDB系列第一课:MongDB简介 MongoDB系列第二课:MongDB环境搭建 MongoDB系列第三课:MongDB用户管理 MongoDB系列第四课:MongoDB数据库.集合.文档的 ...
- mongodb操作指令(一):数据库,集合,文档
数据库 查看所有数据库 show dbs 查看当前数据库 db 创建使用数据库use runoob 删除数据库 db.dropDatabase() 集合 创建集合db.createCollection ...
- 查看sedna创建的数据库和集合,文档之类
在sedna的安装文件夹下.看一下cfg文件夹: <pre name="code" class="plain">[xuzhina@localhost ...
- mongodb的数据库,集合,数据可介绍。
我们知道,在关系型数据库里面有数据库.数据表.表里面是一行一行的数据.而mongodb是非关系型数据库,它有的是数据库.集合.文档,分别对应关系型里面的数据库.数据表.和表里面一行一行的数据.在mon ...
- MongoDB系列---集合与文档操作03
MongoDB-——Collection 学习大纲: 1.集合操作 2.文档操作 知识回顾: 上一篇我们讲述了如何对MongoDB的权限和用户进行日常的基本操作,来达到我们对数据库的基本安全保障. 一 ...
- 3 、操作元素 (属性 CSS 和 文档处理)
3 操作元素-属性 CSS 和 文档处理 3.1 属性操作 $("p").text() $("p").html() $(":check ...
- MongoDB(四):数据类型、插入文档、查询文档
1. 数据类型 MongoDB支持许多数据类型. 字符串 - 这是用于存储数据的最常用的数据类型.MongoDB中的字符串必须为UTF-8. 整型 - 此类型用于存储数值. 整数可以是32位或64位, ...
- MongoDB查询或修改内嵌文档
作为非关系型数据库中的佼佼者,MongoDB一大优势在于能够在一条文档中存储对象类型的数据,适当增加冗余来让数据库更好用.文档中一个对象类型的字段在MongoDB中被称为内嵌文档(Embedded) ...
- DBImport v3.44 中文版发布:数据库数据互导及文档生成工具(IT人员必备)
前言: 距离上一个版本V3.3版本的文章发布,已经是1年10个月前的事了. 其实版本一直在更新,但也没什么大的功能更新,总体比较稳定,所以也不怎么写文介绍了. 至于工作上的事,之前有半年时间跑去学英语 ...
- 关于PowerDesigner导出数据库表到word文档
关于PowerDesigner导出数据库表到word文档 一.查看全部模板: powerdesigner默觉得我们提供了非常多的模版,在工具栏中选择[Report(报告)--->Report T ...
随机推荐
- Nginx 文件名逻辑漏洞(CVE-2013-4547)(Vulhub)
Nginx 文件名逻辑漏洞(CVE-2013-4547)(Vulhub) 漏洞简介 在Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7版本中存在错误解析用户请求的url信息,从 ...
- 【测试】自定义配置 RocksDB 进行 YCSB 测试
目录 简介 编译 RocksDB 编译 YCSB 修复报错 自定义配置 RocksDB 进行 YCSB 测试 参考资料 本文主要记录在利用 YCSB 使用配置文件测试 RocksDB 的过程中遇到的一 ...
- AI绘画关键词Prompt:分享一些质量比较高的StableDiffusion(SD)关键词网站
今天向大家推荐一些SD(StableDiffusion)高质量的 关键词 网站.这些网站的质量可靠,能为大家在创建 AI 绘画时提供有效的参考.以下是六个推荐的网站,优缺点分析. 有几个质量还算是挺高 ...
- Linux 内核音频数据传递主要流程 (下)
来而不往非礼也.前面看到了用户空间应用程序和 DMA buffer 之间交换数据,并更新 runtime->control->appl_ptr 指针的过程,这里看一下硬件设备驱动程序在完成 ...
- 《Linux基础》09. Shell 编程
@ 目录 1:Shell 简介 2:Shell 脚本 2.1:规则与语法 2.2:执行方式 2.3:第一个 Shell 脚本 3:变量 3.1:系统变量 3.2:用户自定义变量 3.2.1:规则 3. ...
- 代码检视的新姿势!在IDEA中得到沉浸式Code Review新体验
大家好,好久不见,又见面了. 在消失的这段时间里,我做了件大事,见证了儿子的出生并陪伴其一天天的成长.停止更文的200多天里,还能得到小伙伴们持续的支持,让我备受鼓励.对一个技术人员而言,分享技术观点 ...
- MySQL篇:第一章_软件安装和基本操作
本篇安装软件Navicate Premium 16破解版和phpstudy_pro phpstudy_pro安装教程 phpstudy官网:https://www.xp.cn/download.htm ...
- xv6 进程切换中的锁:MIT6.s081/6.828 lectrue12:Coordination 以及 Lab6 Thread 心得
引言 这节课和上一节xv6进程切换是一个完整的的进程切换专题,上一节主要讨论进程切换过程中的细节,而这一节主要讨论进程切换过程中锁的使用,所以本节的两大关键词就是"Coordination& ...
- proto转java类时相关option配置
转载请注明出处: option java_multiple_files = true; 作用和意义:此选项指示生成的 Java 代码将被分割成多个文件而不是一个文件.每个消息类型都会生成一个单独的 J ...
- 浅入深出的微前端MicroApp
前言: 本文是由最近做的一个项目有感而发,因为之前做了一些技术栈的统一,为了用ant Design的pro-table,PC统一使用react,但是我们有一些老的项目是vue的,本次新页面较多,老页面 ...