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 (操作数据库,操作集合,操作文档)的笔记的更多相关文章

  1. MongoDB数据库、集合、文档的操作

    MongoDB系列第一课:MongDB简介 MongoDB系列第二课:MongDB环境搭建 MongoDB系列第三课:MongDB用户管理 MongoDB系列第四课:MongoDB数据库.集合.文档的 ...

  2. mongodb操作指令(一):数据库,集合,文档

    数据库 查看所有数据库 show dbs 查看当前数据库 db 创建使用数据库use runoob 删除数据库 db.dropDatabase() 集合 创建集合db.createCollection ...

  3. 查看sedna创建的数据库和集合,文档之类

    在sedna的安装文件夹下.看一下cfg文件夹: <pre name="code" class="plain">[xuzhina@localhost ...

  4. mongodb的数据库,集合,数据可介绍。

    我们知道,在关系型数据库里面有数据库.数据表.表里面是一行一行的数据.而mongodb是非关系型数据库,它有的是数据库.集合.文档,分别对应关系型里面的数据库.数据表.和表里面一行一行的数据.在mon ...

  5. MongoDB系列---集合与文档操作03

    MongoDB-——Collection 学习大纲: 1.集合操作 2.文档操作 知识回顾: 上一篇我们讲述了如何对MongoDB的权限和用户进行日常的基本操作,来达到我们对数据库的基本安全保障. 一 ...

  6. 3 、操作元素 (属性 CSS 和 文档处理)

    3   操作元素-属性 CSS 和 文档处理  3.1 属性操作 $("p").text()    $("p").html()   $(":check ...

  7. MongoDB(四):数据类型、插入文档、查询文档

    1. 数据类型 MongoDB支持许多数据类型. 字符串 - 这是用于存储数据的最常用的数据类型.MongoDB中的字符串必须为UTF-8. 整型 - 此类型用于存储数值. 整数可以是32位或64位, ...

  8. MongoDB查询或修改内嵌文档

    作为非关系型数据库中的佼佼者,MongoDB一大优势在于能够在一条文档中存储对象类型的数据,适当增加冗余来让数据库更好用.文档中一个对象类型的字段在MongoDB中被称为内嵌文档(Embedded) ...

  9. DBImport v3.44 中文版发布:数据库数据互导及文档生成工具(IT人员必备)

    前言: 距离上一个版本V3.3版本的文章发布,已经是1年10个月前的事了. 其实版本一直在更新,但也没什么大的功能更新,总体比较稳定,所以也不怎么写文介绍了. 至于工作上的事,之前有半年时间跑去学英语 ...

  10. 关于PowerDesigner导出数据库表到word文档

    关于PowerDesigner导出数据库表到word文档 一.查看全部模板: powerdesigner默觉得我们提供了非常多的模版,在工具栏中选择[Report(报告)--->Report T ...

随机推荐

  1. Nginx 文件名逻辑漏洞(CVE-2013-4547)(Vulhub)

    Nginx 文件名逻辑漏洞(CVE-2013-4547)(Vulhub) 漏洞简介 在Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7版本中存在错误解析用户请求的url信息,从 ...

  2. 【测试】自定义配置 RocksDB 进行 YCSB 测试

    目录 简介 编译 RocksDB 编译 YCSB 修复报错 自定义配置 RocksDB 进行 YCSB 测试 参考资料 本文主要记录在利用 YCSB 使用配置文件测试 RocksDB 的过程中遇到的一 ...

  3. AI绘画关键词Prompt:分享一些质量比较高的StableDiffusion(SD)关键词网站

    今天向大家推荐一些SD(StableDiffusion)高质量的 关键词 网站.这些网站的质量可靠,能为大家在创建 AI 绘画时提供有效的参考.以下是六个推荐的网站,优缺点分析. 有几个质量还算是挺高 ...

  4. Linux 内核音频数据传递主要流程 (下)

    来而不往非礼也.前面看到了用户空间应用程序和 DMA buffer 之间交换数据,并更新 runtime->control->appl_ptr 指针的过程,这里看一下硬件设备驱动程序在完成 ...

  5. 《Linux基础》09. Shell 编程

    @ 目录 1:Shell 简介 2:Shell 脚本 2.1:规则与语法 2.2:执行方式 2.3:第一个 Shell 脚本 3:变量 3.1:系统变量 3.2:用户自定义变量 3.2.1:规则 3. ...

  6. 代码检视的新姿势!在IDEA中得到沉浸式Code Review新体验

    大家好,好久不见,又见面了. 在消失的这段时间里,我做了件大事,见证了儿子的出生并陪伴其一天天的成长.停止更文的200多天里,还能得到小伙伴们持续的支持,让我备受鼓励.对一个技术人员而言,分享技术观点 ...

  7. MySQL篇:第一章_软件安装和基本操作

    本篇安装软件Navicate Premium 16破解版和phpstudy_pro phpstudy_pro安装教程 phpstudy官网:https://www.xp.cn/download.htm ...

  8. xv6 进程切换中的锁:MIT6.s081/6.828 lectrue12:Coordination 以及 Lab6 Thread 心得

    引言 这节课和上一节xv6进程切换是一个完整的的进程切换专题,上一节主要讨论进程切换过程中的细节,而这一节主要讨论进程切换过程中锁的使用,所以本节的两大关键词就是"Coordination& ...

  9. proto转java类时相关option配置

    转载请注明出处: option java_multiple_files = true; 作用和意义:此选项指示生成的 Java 代码将被分割成多个文件而不是一个文件.每个消息类型都会生成一个单独的 J ...

  10. 浅入深出的微前端MicroApp

    前言: 本文是由最近做的一个项目有感而发,因为之前做了一些技术栈的统一,为了用ant Design的pro-table,PC统一使用react,但是我们有一些老的项目是vue的,本次新页面较多,老页面 ...