ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MongoDB的入门学习二之SQ进行操作CRUD

2022-06-17 22:34:56  阅读:185  来源: 互联网

标签:CRUD MongoDB SQ db 查询 集合 文档 test find


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}}]})

 

 

 

 

 

 

 

 

 

 

 

 

标签:CRUD,MongoDB,SQ,db,查询,集合,文档,test,find
来源: https://www.cnblogs.com/aimangguo/p/16382187.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有