MongoDB的入门学习二之SQ进行操作CRUD
2022/6/18 2:50:18
本文主要是介绍MongoDB的入门学习二之SQ进行操作CRUD,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
SQL语法
选择和创建数据库,如果数据库存在则进入不存在则自动创建
use 数据库名称
查看有权限查看的所有数据库命令
show dbs 或者 show database
注意:在MongoDB中,集合只有在内容插入后才会创建,也就是说,创建集合(事件表)后要再插入一个文档,集合才会真正的创建
查看当前正在使用的数据库命令
db
MongoDB中默认使用的数据库为test,如果你没有选择数据库,集合将存放在test数据库中
创建数据库的规则
数据库名可以是满足以下条件的任意UTF-8字符串, 1.不能是空字符串(""); 2.不得含有''(空格)、.、$、/、\和\0(空字符); 3.应全部小写; 4.最多64字节. 有些数据库名是保留的,可以直接访问这些有特殊作用的数据库. admin: 从权限的的角度看,这是一个root数据库,要是将一个用户添加到这个数据库,这个用户自动 继承所有数据库的权限,一些特定的服务器端命令也只能从这个数据库执行,比如说列出所有的 数据库或关闭服务器. local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合. config: 当mongo用于分片设置时,config数据在内部使用,用于不保存分片的相关信息.
数据库的删除
删除语法规则如下:
主要用来删除已经持久化的数据库
db.dropDatabase();
集合操作
集合,类似于关系型数据库中的表
可以显示的创建也可以隐式的创建
集合的显式创建
基本语法:
db.createCollection(name); #name:要创建的集合名字
示例:
db.createCollection("test");
显示当前数据库有什么集合
show collections; 或者 show tables;
集合的命名规范
- 集合名不能是空字符串
- 集合名不能含有
\0
字符(空字符),这个字符表示集合名的结尾。 - 集合名不能以
system.
开头,这是为系统集合保留的前缀。 - 用户创建的集合命名不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里面出现
$
.
文档的命名规范
- 键不能含有
\0
(空字符)。这个字符用来表示键的结尾。 .
和$
有特别的意义,只有在特定环境下才能使用。- 以下划线
_
开头的键是保留的(不是严格要求的)。
集合的删除
集合删除语法格式如下:
db.collection.drop(); 或者 db.集合.drop();
文档的CRUD
mongoDB中文官网
https://www.mongodb.org.cn/
文档的数据结构和JSON基本一样
所有储存在集合的数据都是BSON格式
文档的插入
单个文档的插入
使用insert()或者save()方法向集合插入文档,
语法
db.collection.insert( <document or array of documents>, { writeConcern: <document>, ordered: <boolean> } )
示例
db.test.insert({ "articleid":"10000", "content":"今天天气真好,阳光明媚", "userid":"1001", "nickname":"Rose", "createdatetime":new Date, "likenum":NumberInt(10), "state":null })
提示 comment集合如果不存在,则会隐式创建 mongo中的数组,默认情况下是double类型,如果要存整数型,必须使用函数NumberInt(整形数字),否则取出来就有问题了。 插入当前时间使用new Date() 插入的数据没有指定_id,则会生成主键值 如果某字段没有值,可以赋值为null,或者不写该字段。
批量插入
语法
db.collection.insertMany( [ <document 1> , <document 2>, ... ], { writeConcern: <document>, ordered: <boolean> } )
示例
db.test.insert([{ "_id":"2", "articleid":"10001", "content":"因为有你所以感到幸福", "userid":"1001", "nickname":"Rose", "createdatetime":new Date(), "likenum":NumberInt(10), "state":"1" },{ "_id":"3", "articleid":"10001", "content":"幸福是什么,爱情又是什么", "userid":"1002", "nickname":"Rose", "createdatetime":new Date(), "likenum":NumberInt(10), "state":"1" },{ "_id":"4", "articleid":"10001", "content":"开心就好", "userid":"1003", "nickname":"Rose", "createdatetime":new Date(), "likenum":NumberInt(10), "state":"1" }]);
提示 插入时指定了_id则主键就是该值 如果某条数据插入失败,将会终止插入,但已经插入成功的数据不会回滚掉
基本查询
普通查询
语法
db.collection.find(查询,投影) 或者 db.collection.find(); 或者 db.collection.find({});
示例
db.collection.find(); 或者 db.test.find({articleid:"10001"});
查询的时候你会发现文档有一个叫_id的字段,这个相当于我们原来关系型数据库中的主键,当你在插入文档记录时候没有指定该字段,MongoDB会自动创建,其类型是ObjectID类型
单个查询
如果你只需要返回符合条件的第一条数据,我们可以使用findOne命令来实现,语法和find一样。
如:查询用户编号是10001的记录,但只返回条件的第一条记录
语法
db.collection.findOne(查询,投影)
示例
db.test.findOne({articleid:"10001"});
投影查询
如果要查询结果返回部分字段,则需要使用投影查询
如果要查询返回部分字段、则需要使用投影查询。
如:查询结果只显示_id、userid、nickname
db.test.find({userid:"1001"},{userid:1,nickname:1});
默认_id会显示
如果结果只显示、userid、nickname、不显示_id
db.test.find({userid:"1001"},{userid:1,nickname:1,_id:0});
查询所有数据、但这是显示_id、userid、nickname
db.test.find({},{userid:1,nickname:1});
文档插入使用trycatch
因为批量插入由于数据较多容易出现失败,因此可以使用try catch进行异常捕捉处理、测试的时候可以不处理。
try{ db.test.insert([{ "_id":"2", "articleid":"10001", "content":"因为有你所以感到幸福", "userid":"1001", "nickname":"Rose", "createdatetime":new Date(), "likenum":NumberInt(10), "state":"1" },{ "_id":"3", "articleid":"10001", "content":"幸福是什么,爱情又是什么", "userid":"1002", "nickname":"Rose", "createdatetime":new Date(), "likenum":NumberInt(10), "state":"1" },{ "_id":"4", "articleid":"10001", "content":"开心就好", "userid":"1003", "nickname":"Rose", "createdatetime":new Date(), "likenum":NumberInt(10), "state":"1" }]); }catch(e){ print(e) }
文档的更新
更新文档的语法
db.collection.update(query,update,option) 或 db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document>, collation: <document>, arrayFilters: [ <filterdocument1>, ... ], hint: <document|string> // Available starting in MongoDB 4.2 } )
参数
该db.collection.update()
方法采用以下参数:
局部修改
如果我们想修改_id为1001,输入以下语句:
db.test.update({_id:"3"},{$set:{"likenum":NumberInt(1001)}})
批量修改
更新所有用户为10001的用户的名称为凯达大帝
5.0之前
db.test.update({_id:"10003"},{$set:{"nickname":"凯撒大帝"}},{multi:true}); db.tables.update({"Package":"Secret"},{$set:{"rank":100}},false,true)
列值增长的修改
如果我们想实现对某列值在原有值的基础上进行增加或者减少,可以使$inc运算符来实现
db.test.update({_id:"3"},{$inc:{likenum:NumberInt(1)}});
批量修改updateMany
db.test.updateMany({"articleid":"10001"},{$set:{"nickname":"凯撒大帝"}});
删除操作
语法
#删除多个 db.集合名字.remove(条件) #删除全部 db.comment.remove({})
删除id=1的记录输入下面的语句
db.test.remove({_id:"3"})
Mongodb对字段的操作
新增字段(5.0之后)
示例
db.test.updateMany({},{$set:{"age":NumberInt(1001)}})
新增字段(5.0之前)
示例
db.test.update({},{$set:{"age":NumberInt(1001)}})
修改字段(5.0之后)
语法
db.collection.updateMany(criteria,objNew,upsert,multi) 参数说明: criteria:查询条件 objNew:update对象和一些更新操作符 upsert:如果不存在update的记录,是否插入objNew这个新的文档,true为插入,默认为false,不插入。 multi:默认是false,只更新找到的第一条记录。如果为true,把按条件查询出来的记录全部更新。
示例
db.getCollection('test').updateMany({}, {$rename : {"age" : "age1"}}, false, true);
修改字段(5.0之前)
db.collection.update(criteria,objNew,upsert,multi) 参数说明: criteria:查询条件 objNew:update对象和一些更新操作符 upsert:如果不存在update的记录,是否插入objNew这个新的文档,true为插入,默认为false,不插入。 multi:默认是false,只更新找到的第一条记录。如果为true,把按条件查询出来的记录全部更新。
示例
db.getCollection('test').update({}, {$rename : {"age" : "age1"}}, false, true);
5.0之后使用update的时候multi字段不生效只会修改一个。
玩法test这个数组有ag1这个值等于1002并likenum为空的ag1字段的值删除
db.getCollection('test').updateMany({"ag1":1002,"likenum":null},{$unset:{'ag1':''}},false, true)
修改字段类型
首先对字段类型进行判断
$type可以用来根据数据类型查找数据,比如我想要查找x类型为数字的文档
//所有的status字段类型为Double类型的进行统计 db.tb_name.find({"status":{$type:"double"}).count() //所有status字段类型为Double类型的进行统计 db.tb_name.find({"status":{$type:1}).count() //查询所有age字段类型为Int不进行统计 db.test.find({"age": {$type:16}}); //查询所有类型的 db.test.find({"age": {$exists: true}});
mongodb中存在的字段类型
$not
$not用来执行取反操作,比如我想要查询所有dis的类型不为数字的文档,如下:
db.demolist.find({dis:{$not:{$type:1}}})
删除字段
示例把 test这个数组有ag1这个值等于1002的ag1字段删除
db.getCollection('test').updateMany({"ag1":1002},{$unset:{'ag1':''}},false, true)
文档的分页查询
统计查询
统计查询使用count()方法
语法
db.collection.count(query,options)
参数
参数 | 类型 | 描述 |
---|---|---|
query |
文献 | 查询选择条件。 |
options |
文献 | 可选的。用于修改计数的其他选项。 |
该options
文档包含以下字段:
领域 | 类型 | 描述 |
---|---|---|
limit |
整数 | 可选的。要计算的最大文件数。 |
skip |
整数 | 可选的。计数前要跳过的文档数。 |
hint |
字符串或文件 | 可选的。索引名称提示或查询规范。 |
maxTimeMS |
整数 | 可选的。允许查询运行的最长时间。 |
readConcern |
串 |
可选的。指定读取关注。默认级别为 若要使用关注级别 您可以 为确保单个线程可以读取其自己的写入, 要使用的关注度 3.2版中的新功能。 |
collation |
文献 |
可选的。 指定 用于操作的排序规则。 归类允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。 排序规则选项具有以下语法: collation: { locale: <string>, caseLevel: <boolean>, caseFirst: <string>, strength: <int>, numericOrdering: <boolean>, alternate: <string>, maxVariable: <string>, backwards: <boolean> } 指定排序规则时,该 如果未指定排序规则,但是集合具有默认排序规则(请参阅参考资料 如果没有为集合或操作指定排序规则,则MongoDB使用先前版本中使用的简单二进制比较进行字符串比较。 您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果对排序执行查找,则不能对查找使用一种排序规则,而对排序使用另一种排序规则。 3.4版的新功能。 |
count()
等价于 db.collection.find(query).count()
构造。
提示
可选项暂时不使用
示例
统计test集合的所有的记录数
db.test.count()
带条件统计统计age为1002的记录条数
db.test.count({age:1002});
提示
默认情况下count()方法会返回符合条件的全部记录数
分页列表查询
可以使用limit()方法来读取指定的数量,使用skip()方法来跳过指定数量的数据。
基本语法:
db.collection.find().limit(number).skip(NUMBER)
如果你想返回指定条数的记录,可以在find方法后调用返回结果(TopN),默认值为20例如
db.test.find().limit(3)
skip方法同样接受一个数字作为跳过的记录数据。(前面N不要),默认值为0
db.test.find().skip(3)
分页查询:需求:每页两个,第二个开始,跳过两条数据,接着值显示3和4
//第一页 db.test.find().skip(0).limit(2) //第二个 db.test.find().skip(2).limit(2) //第三个 db.test.find().skip(4).limit(2)
排序查询
sort()方法对数据进行排序、sort()方法可以通过参数指定排序的字段,并使用1和-1来指导的排序的方式,其中1为升序排序而-1是降序排序
语法
db.collection.find().sort({KEY:1}) 或者 db.集合名称.find().sort(排序方式)
列如: 对userid降序排列,并对访问量进行升序排列
db.test.find().sort({userid:-1,likenum:1})
提示
skip(),limit(),sort()三个放在一起执行的时候,执行的顺序是先sort(),然后是skip(),最后显示的是limit()和命令编写顺序无关
关于文档更多的查询
正则的复杂条件查询
MongoDB的模糊查询是通过正则表达式的方式来实现的。格式为:
db.test.find({field:/正则表达式/}) 或者 db.集合.find({字段:/正则表达式/})
提示:正则表达式是js的写法,直接量的写法
例如:我要查询评论内容包含"开水"的所有文档,代码如下:
db.getCollection("test").find({"content":/天气/}) 或者 db.test.find({"content":/^天气/})
如果要查询评论内容以专家开头的,代码如下:
db.getCollection("test").find({"content":/^今/})
或者 db.test.find({"content":/^天气/})
如果要查询评论内容以e结尾的,代码如下:
db.test.find({name:/e$/})
比较查询
<,<=,>,>=这个操作符也是很常见的,格式如下:
db.集合名称.find({"field":{$gt:value}})//大于 field>value db.集合名称.find({"field":{$lt:value}})//小于 field<value db.集合名称.find({"field":{$gte:value}})//大于 field>=value db.集合名称.find({"field":{$lte:value}})//大于 field<=value db.集合名称.find({"field":{$ne:value}})//大于 field!=values
示例
db.test.find({age:{$gt:NumberInt(1002)}})
MongoDB 使用 (<) 和 (>) 查询 - $lt 和 $gt 如:获取集合中 “age” 小于 30 大于24 的数据
db.collection.find({age:{$lt:30,$gt:24}});
包含查询
包含使用$in操作符
$in表示查询某一个字段在某一个范围中的所有文档
示例:查询评论的集合userid字段包含1003或者1004的文档
db.collection.find({userid:{$in:["1003","1004"]}})
不包含使用$nin操作符
$nin表示查询不在某一个字段在某一个范围中的所有文档
示例:查询评论集合中userid字段不包含1003和1004的文档
db.test.find({user:{$nin:["1003","1004"]}})
条件连接查询
我们如果查询的同时要满足两个以上条件,需要使用$and操作符条件进行关联。(相当于SQL的and)
$and:[{},{},{}]
示例:查询评论集合中likenum大于等于700并小于2000的文档
db.test.find({$and:[{likenum:{$gte:NumberInt(1)}},{likenum:{$lt:NumberInt(2000)}}]});
如果两个以上条件或者关系则我们使用操作符进行关联,与前面and的使用方式相同
格式为:
$or:[{},{},{}]
示例:查询评论集合中的userid为1003,或者点赞数小于1000的文档记录
db.comment.find({$or:[{userid:1003},{likenum:{$lt:1000}}]})
这篇关于MongoDB的入门学习二之SQ进行操作CRUD的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-24MongoDB资料:新手入门完全指南
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享