学习主题:MongoDb
学习目标:
1.掌握mongodb文档的更新
2.掌握mongodb文档的删除
3.掌握mongodb文档的查找
4.掌握mongodb文档的条件操作符
5.掌握mongodb中的索引操作
1.Mongodb的更新方式有?
uodate函数更新,覆盖更新,表达式更新
2.Mongodb的update更新?
update() 函数用于更新已存在的文档。
语法格式:
db.集合名称.update(
,
,
< upsert:boolean>,
< multi:boolean>
)
参数说明:
query : update 的查询条件,类似 sql update 更新语法内 where 后面的内容。
update : update 的对象和一些更新的操作符等,也可以理解为 sql update 查询内 set 后面
的。
upsert : 可选,这个参数的意思是,如果不存在 update 的记录,是否插入这个 document,
true 为插入,默认是 false,不插入。
multi : 可选,mongodb 默认是 false,只更新找到的第一条记录,如果这个参数为 true,就把按条件查出来多条记录全部更新。
3.Mongodb的更新操作符有哪些 都是什么意思?
1、 KaTeX parse error: Expected '}', got 'EOF' at end of input: inc 用法:{inc:{field:value}}
作用:对一个数字字段的某个 field 增加 value
命令:db.stu.update({name:“zhangsan”},{$inc:{age:5}})
2、 KaTeX parse error: Expected '}', got 'EOF' at end of input: set 用法:{set:{field:value}}
作用:把文档中某个字段 field 的值设为 value,如果 field 不存在,则增加新的字段并赋值为 value。
命令:db.stu.update({name:“zhangsan”},{KaTeX parse error: Expected 'EOF', got '}' at position 15: set:{'age':23}}̲) 3、 #unset 用法:…unset:{field:1}}
作用:删除某个字段 field
命令:db.stu.update({name:“zhangsan”},{$unset:{age:1}})
4、 KaTeX parse error: Expected '}', got 'EOF' at end of input: push 用法:{push:{field:value}}
作用:把 value 追加到 field 里。注:field 只能是数组类型,如果 field 不存在,会自动插入一个数组类型
命令:
db.stu.update({name:“zhangsan”},{$push:{“alias”:“xiaozhang”}})
5、 KaTeX parse error: Expected '}', got 'EOF' at end of input: addToSet 用法:{addToSet:{field:value}}
作用:加一个值到数组内,而且只有当这个值在数组中不存在时才增加。
命令:
db.stu.update({name:“zhangsan”},{$addToSet:{“alias”:[“A1”,“A2”]}})
6、 KaTeX parse error: Expected '}', got 'EOF' at end of input: … 用法:删除数组内第一个值:{pop:{field:-1}}、删除数组内最后一个值:{KaTeX parse error: Expected 'EOF', got '}' at position 14: pop:{field:1}}̲ 作用:用于删除数组内的一个值…pop:{“alias”:1}})
7、 KaTeX parse error: Expected '}', got 'EOF' at end of input: pull 用法:{pull:{field:_value}}
作用:从数组 field 内删除一个等于_value 的值
命令:
db.stu.update({name:“zhangsan”},{$pull:{“alias”:“xiaozhang”}})
8、 KaTeX parse error: Expected '}', got 'EOF' at end of input: pullAll 用法:{pullAll:value_array}
作用:用法同KaTeX parse error: Expected '}', got 'EOF' at end of input: …e:"zhangsan"},{pullAll:{“alias”:[“A1”,“A2”]}})
9、 KaTeX parse error: Expected '}', got 'EOF' at end of input: rename 用法:{rename:{old_field_name:new_field_name}}
作用:对字段进行重命名。底层实现是先删除 old_field 字段,再创建 new_field 字段。
命令:db.stu.update({name:“zhangsan”},{$rename:{“name”:“sname”}})
4.Mongodb的save()更新?
save()函数的作用是保存文档,如果文档存在则覆盖,如果文档不存在则新增。save()
函数对文档是否存在的唯一判断标准是"_id"系统唯一字段是否匹配。所以使用 save()函数实现更新操作,则必须提供"_id"字段数据。
save()函数的语法是:
db.集合名称.save(
);
参数 document 代表要修改的文档内容,要求必须提供"_id"字段数据。
5.Mongodb删除文档的三种方式?
1、Remove:
db.集合.remove({}):可以条件删除({}:条件),也可以删除全部({}:为空)
2、DeleteOne
deleteOne默认删除满足条件的第一条数据,而且该方法删除是释放空间的
语法格式:
db.集合名称.deleteOne({});
参数解释:
query:要删除的文档条件,相当于 SQL 语法中的 where 子句作用。
3、DeleteMany
删除多个文档,也可以删除全部({}:为空)
语法格式:
db.集合名称.deleteMany({});
参数解释:
query:要删除的文档条件,相当于 SQL 语法中的 where 子句作用。
6.Mongodb如何实对文档的查询,请举例说明?
find()函数查询文档
语法格式:find({查询条件(可选)},{指定投影的键(可选)})
如果未给定参数则表示查询所有
pretty()函数可以使用格式化的方式来显示所有的文档
findOne()函数查询文档
语法格式:findOne({查询条件(可选)})
如果未给定参数则表示查询所有集合中数据的第一条
如果给了查询条件,则返回所有符合条件数据的第一条
模糊查询
db.dev.find({title:/a/})
/ 字母汉字 / :代表查询字段中包含某个字母或者汉字的字段值
db.dev.find({title:/^s/})
/ ^ 字母汉字 / :代表查询字段以什么开头的字段(注意大小写)
db.dev.find({tags:/x$/})
/ 字母汉字 $ / :代表查询字段以什么结尾
7.Mongodb中的投影操作指的是?
在find()函数中可以指定投影键
语法格式:
Find({查询条件},{投影键名:1(显示该列)| 0(不显示该列)})
在findOne()函数中也可以指定投影键,只是查询符合的第一条数据
8.条件运算符有哪些 分别什么意思?
1and和or如何联合使用?
db.dev.find({KaTeX parse error: Expected '}', got 'EOF' at end of input: or:[{and:[{title:‘dev_h’},{size:300}]},{title:‘dev’}]})
db.dev.find({KaTeX parse error: Expected '}', got 'EOF' at end of input: or:[{and:[{title:{KaTeX parse error: Expected 'EOF', got '}' at position 11: eq:'dev_h'}̲},{size:{eq:300}}]},{title:{$eq:‘dev’}}]})
9.每页显示5条查看第5页的数据如何实现?
db.dev.find({},{title:1}).skip(20).limit(5)
10.如何实现排序,两个条件如何排序 如年龄一致按照分数排序?
在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序 的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列
db.dev.find({条件}).sort({age:1,score:1})
11.如何创建索引?
我们可以使用createIndex()函数来为其它的键创建索引。在创建索引的时候需要指定排序规则,1是按照升序,-1按照降序
语法格式:
db.集合名称.createIndex({创建索引的键:排序规则…})
db.dev.createIndex({title:1},{background:true})
12.如何查看索引?
查看索引 db.dev.getIndexes()
查看集合中所有的索引信息db.dev.getIndexKeys()
查看集合中的索引键信息db.dev.getIndexSpecs()
查看集合中的索引详情db.dev.totalIndexSize()
查看集合的索引总大小:db.stu.totalIndexSize();
或db.stu.totalIndexSize(0);
或db.stu.totalIndexSize(false);
查看集合的每个索引的大小及总大小:db.stu.totalIndexSize(1);
或db.stu.totalIndexSize(true);
13.删除索引有几种方式,分别举例说明?
删除指定索引:
db.集合名称.dropIndex(‘索引名’)
删除所有索引(默认的 _id 索引除外):
db.集合名称.dropIndexes()
14.索引类型有哪些,有何作用?
1、单字段索引
如:db.stu.ensureIndex({‘age’:1});
上述语句针对 age 创建了单字段索引,其能加速对 age 字段的各种查询请求,是最常见的索引形式,MongoDB 默认创建的 id 索引也是这种类型。
{age: 1} 代表升序索引,也可以通过{age: -1}来指定降序索引,对于单字段索引,升序/降序效果是一样的。
2、交叉索引
为一个集合的多个字段分别建立索引,在查询的时候通过多个字段作为查询条件,这种情况称为交叉索引。
交叉索引的查询效率较低,在使用时,当查询使用到多个字段的时候,尽量使用复合索引,而不是交叉索引。
3、复合索引
复合索引是 Single Field Index 的升级版本,它针对多个字段联合创建索引,先按第一个
字段排序,第一个字段相同的文档按第二个字段排序,依次类推,如下针对 age, name 这 2个字段创建一个复合索引。
如:db.stu.ensureIndex({‘age’:1, ‘name’:1});
4、多key索引
当索引的字段为数组时,创建出的索引称为多 key 索引,多 key 索引会为数组的每个元素建立一条索引,比如 stu 集合加入一个 habbit 字段(数组)用于描述兴趣爱好,需要查询有相同兴趣爱好的人就可以利用 habbit 字段的多 key 索引。
5、唯一索引
保证索引对应的字段不会出现相同的值,比如_id 索引就是唯一索引
如:db.stu.ensureIndex({‘name’:1},{‘unique’:true});
如果唯一索引所在字段有重复数据写入时,抛出异常。
6、部分索引
针对符合某个特定条件的文档建立索引,3.2 版本才支持该特性。
MongoDB 部分索引只为那些在一个集合中,满足指定的筛选条件的文档创建索引。由于部分索引是一个集合文档的一个子集,因此部分索引具有较低的存储需求,并降低了索引创建和维护的性能成本。部分索引通过指定过滤条件来创建,可以为 MongoDB 支持的所有索引类型使用部分索引。
简单点说:部分索引就是带有过滤条件的索引,即索引只存在与某些文档之上
如:
db.stu.createIndex({‘name’:1},{‘unique’:true,‘partialFilterExpression’:{‘age’: {$gt:25}}})
注意:部分索引只为集合中那些满足指定的筛选条件的文档创建索引。如果你指定的partialFilterExpression 和唯一约束、那么唯一性约束只适用于满足筛选条件的文档。具有唯一约束的部分索引不会阻止不符合唯一约束且不符合过滤条件的文档的插入。
15.使用索引需要注意什么?
索引虽然加快了查询速度,但是索引也是有代价的,索引文件本身要消耗存储空间,同时索引会加重插入、删除和修改记录时的负担,另外,数据库在运行时也要消耗资源维护索引,因此索引并不是越多越好。
16.索引限制指的是?
1、 额外开销
每个索引占据一定的存储空间,在进行插入,更新和删除操作时也需要对索引进行操作。所以,如果你很少对集合进行读取操作,建议不使用索引。
2、 内存使用
由于索引是存储在内存(RAM)中,你应该确保该索引的大小不超过内存的限制。
如果索引的大小大于内存的限制,MongoDB 会删除一些索引,这将导致性能下降。
3、 查询限制
索引不能被以下的查询使用:
正则表达式(最左匹配除外)及非操作符,如 $nin, $not, 等。
算术运算符,如 $mod, 等。
所以,检测你的语句是否使用索引是一个好的习惯,可以用 explain 来查看。
4、 最大范围
集合中索引不能超过 64 个
索引名的长度不能超过 128 个字符
一个复合索引最多可以有 31 个字段