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

可选的。指定读取关注。默认级别为 "local"

若要使用关注级别"majority",副本集必须使用WiredTiger存储引擎。

您可以"majority"为具有三名成员的主次仲裁器(PSA)架构的部署禁用读取关注。但是,这对变更流(仅在MongoDB 4.0和更早版本中)和分片群集上的事务有影响。有关更多信息,请参见禁用多数阅读关注。

为确保单个线程可以读取其自己的写入,"majority"请对"majority" 副本集的主数据库使用 读取关注和写入关注。

要使用的关注度"majority",您必须指定一个非空query条件。

3.2版中的新功能。

collation 文献

可选的。

指定 用于操作的排序规则。

归类允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。

排序规则选项具有以下语法:

collation: {
   locale: <string>,
   caseLevel: <boolean>,
   caseFirst: <string>,
   strength: <int>,
   numericOrdering: <boolean>,
   alternate: <string>,
   maxVariable: <string>,
   backwards: <boolean>
}

指定排序规则时,该locale字段为必填字段;所有其他排序规则字段都是可选的。有关字段的说明,请参见整理文档。

如果未指定排序规则,但是集合具有默认排序规则(请参阅参考资料db.createCollection()),则该操作将使用为集合指定的排序规则。

如果没有为集合或操作指定排序规则,则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的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程