- Mongodb的更新方式有?
- db.集合名.update() 函数:用于更新已存在的文档。
语法格式:db.COLLECTION_NAME.update({查询条件},{更新内容},{更新参数(可选)})
注:这种方式会覆盖原有的文档。
- 使用更新操作符
- 使用 save()函数更新文档
- Mongodb的update更新?
db.集合名.update({key:“value”},{key:“value”})
- Mongodb的更新操作符有哪些 都是什么意思?
$set:更新文档(只更新指定键,不会覆盖整个文档),若该键不存在,会自动创建,并插入数据
$unset:删除指定键
$push:向文档的某个数组类型的键添加一个数组元素,不过滤重复的数据。添 加时键存在,要求键值类型必须是数组;键不存在,则创建数组类型的键
$inc:对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作。
$pop 操作符:删除数据元素,给定值1表示从数组尾部删除,-1表示从数组头部删除。
$pull 操作符:从数组中删除满足条件的元素
$pullAll 操作符:从数组中删除满足条件的多个元素
$rename 操作符:对键进行重新命名。
- Mongodb的save()更新?
save() 方法通过传入的文档来替换已有文档。
语法格式:db.集合名.save({文档})
- Mongodb删除文档的三种方式?
- remove()函数
使用 remove()函数可删除集合中的指定文档。
语法格式:remove({指定删除条件},删除参数(可选参数))
如果使用的条件在集合中可以匹配多条数据,那么 remove()函数会删除所有满足条件的 数据。我们可以在 remove 函数中给定 justOne,表示只删除第一条,在 remove 函数中给定
注意:remove() 方法 并不会真正释放空间。需要继续执行 db.repairDatabase() 来回收 磁盘空间 参数 1 即可。
2. deleteOne()函数
deleteOne()函数是官方推荐删除文档的方法。该方法只删除满足条件的第一条文档。
3.deleteMany()函数
deleteMany 函数是官方推荐的删除方法。该方法删除满足条件的所有数据。 再次插入两条测试数据
删除集合中的所有文档 1.remove({}) 、2.deleteMany({})
- Mongodb如何实对文档的查询,请举例说明?
1 find()函数
在 MongoDB 中可以使用 find()函数查询文档。
语法格式为:find({查询条件(可选)},{指定投影的键(可选)}) 如果未给定参数则表示查询所有数据。
pretty()函数可以使用格式化的方式来显示所有文档。
2 findOne()函数
findOne()函数只返回满足条件的第一条数据。如果未做投影操作该方法则自带格式化功 能。
语法格式:findOne({查询条件(可选)},{投影操作(可选)})
3 模糊查询
在 MongoDB 中可以通过//与^ 、$实现模糊查询,注意使用模糊查询时查询条件不能放到 双引号或单引号中。使用^表示起始位置,使用$表示结尾位置。
- Mongodb中的投影操作指的是?
在 find 函数中我们可以指定投影键。
语法格式为:find({查询条件},{投影键名:1(显示该列)|0(不显示该列),投影键名:1|0,......})
_id 列默认为显示列。如果不显示_id 可在投影中通过 0 过滤
- 条件运算符有哪些 分别什么意思?
$gt:大于指定条件,用于数字或日期运算
$lt:小于指定条件,用于数字或日期运算
$gte:大于等于指定条件,用于数字或日期运算
$lte:小于等于指定条件,用于数字或日期运算
$eq:等于指定条件,用于数字或日期运算
$ne:不等于指定条件,用于数字或日期运算
$and:表示多条件间的并且关系
语法格式为:find({$and:[{条件一},{,条件二},.......]})
注意:这种方式只能当参与判断的条件key相同时使用
$or:表示多条件间的或者关系。
语法格式为:find({$or:[{条件一},{条件二},.....]})
8.1and和or如何联合使用?
查询 title 为 test5 并且 size 等于 500,或者 size 小于 400 的文档。
$type:根据value的类型查询
- 每页显示5条查看第5页的数据如何实现?
limit函数:使用 MongoDB 的 Limit 函数, limit()函数接受一个数字参数,该参数指定从 MongoDB 中读取的记录条数。
语法格式:db.COLLECTION_NAME.find().limit(NUMBER)
skip函数:使用 skip()函数来跳过 指定数量的数据,skip 函数同样接受一个数字参数作为跳过的记录条数。
语法格式:db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
实现分页显示第五页数据,每页五条:
db.dev.find({},{title:1,_id:0}).skip(25).limit(5)
注意:我们可以使用 skip 函数与 limit 函数实现 MongoDB 的分页查询,但是官方并不推荐这 样做,因为会扫描全部文档然后在返回结果,效率过低。
- 如何实现排序,两个条件如何排序 如年龄一致按照分数排序?
在 MongoDB 中使用 sort() 函数对查询到的文档进行排序,sort() 函数可以通过参数 指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于 降序排列。
语法格式:db.COLLECTION_NAME.find().sort({排序键:1})
- 如何创建索引?
在 MongoDB 中会自动为文档中的_Id(文档的主键)键创建索引,与关系型数据的主键索 引类似。 我们可以使用 createIndex()函数来为其他的键创建索引。在创建索引时需要指定排序规 则。1 按照升序规则创建索引,-1 按照降序规则创建索引。 在创建索引时,需要使用具有 dbAdmin 或者 dbAdminAnyDatabase 角色的用户。
语法格式:db.COLLECTION_NAME.createIndex({创建索引的键:排序规则,......},{创建索 引的参数(可选参数)})
- 如何查看索引?
通过 getIndexes()或者 getIndexSpecs()函数查看集合中的所有索引信息。
语法格式:db.COLLECTION_NAME.getIndexes()
语法格式:db.COLLECTION_NAME.getIndexSpecs()
使用db.集合名.getIndexKeys()查看集合中的索引键
查看索引大小:
我们可以通过 totalIndexSize()函数来查看当前集合中索引的大小,单位为字节。
语法格式:db.COLLECTION_NAME.totalIndexSize([detail](可选参数)) 参数解释:detail 可选参数,传入除 0 或 false 外的任意数据,那么会显示该集合中每个 索引的大小及集合中索引的总大小。如果传入 0 或 false 则只显示该集合中所有索引的总大 小。默认值为 false。
- 删除索引有几种方式,分别举例说明?
1. 删除集合中的指定索引
通过 dropIndex()函数来删除指定索引。
语法格式:db.COLLECTION_NAME.dropIndex("索引名称")。
2. 删除集合中的全部索引
使用 dropIndexes()函数删除集合中的全部索引,_id 键的索引除外。
语法格式:db.COLLECTION_NAME.dropIndexes()
注意:_id索引不会被删除掉
3.重建索引
我可以使用 reIndex()函数重建索引。重建索引可以减少索引存储空间,减少索引碎片, 优化索引查询效率。一般在数据大量变化后,会使用重建索引来提升索引性能。重建索引是 删除原索引重新创建的过程,不建议反复使用。
语法格式:db.COLLECTION_NAME.reIndex()
- 索引类型有哪些,有何作用?
1.单字段索引(Single Field Index)
所谓单字段索引是指在索引中只包含了一个键。查询时,可加速对该字段的各种查询请 求,是最常见的索引形式。MongoDB 默认创建的_Id 索引也是这种类型。我们可以使用 createIndexes({索引键:排序规则})函数来创建单字段索引
语法格式:db.COLLECTION_NAME.createIndexes({索引键名:排序规则})
2 交叉索引
所谓交叉索引就是为一个集合的多个字段分别建立索引,在查询的时候通过多个字段作 为查询条件,这种情况称为交叉索引。 在查询文档时,在查询条件中包含一个交叉索引键或者在一次查询中使用多个交叉索引 键作为查询条件都会触发交叉索引。
3 复合索引(Compound Index)
复合索引是 Single Field Index 的升级版本,它针对多个字段联合创建索引,先按第一个 字段排序,第一个字段相同的文档按第二个字段排序,依次类推。 语法格式:db.COLLECTION_NAME.createIndex({索引键名:排序规则, 索引键名:排序规 则,......}); 复合索引能满足的查询场景比单字段索引更丰富,不光能满足多个字段组合起来的查 询,也能满足所以能匹配符合索引前缀的查询。
4 多 key 索引 (Multikey Index)
当索引的字段为数组时,创建出的索引称为多 key 索引,多 key 索引会为数组的每个元 素建立一条索引。
语法格式:db.COLLECTION_NAME.createIndex({数组键名:排序规则});
5. 唯一索引 (unique index)
唯一索引会保证索引对应的键不会出现相同的值,比如_id 索引就是唯一索引
语法格式:db.COLLECTION_NAME.createIndex({索引键名:排序规则},{unique:true}) 如果唯一索引所在字段有重复数据写入时,抛出异常。
6.部分索引 (partial index):
部分索引是只针对符合某个特定条件的文档建立索引,3.2 版本才支持该特性。 MongoDB 部分索引只为那些在一个集合中,满足指定的筛选条件的文档创建索引。由 于部分索引是一个集合文档的一个子集,因此部分索引具有较低的存储需求,并降低了索引 创建和维护的性能成本。部分索引通过指定过滤条件来创建,可以为 MongoDB 支持的所有 索引类型使用部分索引。 简单点说:部分索引就是带有过滤条件的索引,即索引只存在与某些文档之上
语 法 格 式 : db.COLLECTION_NAME.createIndex({ 索引键名: 排 序 规 则},{partialFilterExpression:{键名:{匹配条件:条件值}}})
注意:部分索引只为集合中那些满足指定的筛选条件的文档创建索引。如果你指定的 partialFilterExpression 和唯一约束、那么唯一性约束只适用于满足筛选条件的文档。具有唯 一约束的部分索引不会阻止不符合唯一约束且不符合过滤条件的文档的插入
- 使用索引需要注意什么?
1.建立合适的索引
为每一个常用查询结构建立合适的索引。 复合索引是创建的索引由多个字段组成,例如: db.test.createIndex({"username":1, "age":-1}) 交叉索引是每个字段单独建立索引,但是在查询的时候组合查找,例如: db.test.createIndex({"username":1}) db.test.createIndex({"age":-1}) db.test.find({"username":"kaka", "age": 30}) 交叉索引的查询效率较低,在使用时,当查询使用到多个字段的时候,尽量使用复合索 引,而不是交叉索引
2 复合索引的字段排列顺序
当我们的组合索引内容包含匹配条件以及范围条件的时候,比如包含用户名(匹配条件)
以及年龄(范围条件),那么匹配条件应该放在范围条件之前。
3.查询时尽可能仅查询出索引字段
有时候仅需要查询少部分的字段内容,而且这部分内容刚好都建立了索引,那么尽可能 只查询出这些索引内容,需要用到的字段显式声明(_id 字段需要显式忽略!)。因为这些 数据需要把原始数据文档从磁盘读入内存,造成一定的损耗
4.对现有的数据大表建立索引的时候,采用后台运行方式
在对数据集合建立索引的过程中,数据库会停止该集合的所有读写操作,因此如果建立 索引的数据量大,建立过程慢的情况下,建议采用后台运行的方式,避免影响正常业务流程。
- 索引限制指的是?
1.额外开销
每个索引占据一定的存储空间,在进行插入,更新和删除操作时也需要对索引进行操作。 所以,如果你很少对集合进行读取操作,建议不使用索引。
2 内存使用
由于索引是存储在内存(RAM)中,你应该确保该索引的大小不超过内存的限制。 如果索引的大小大于内存的限制,MongoDB 会删除一些索引,这将导致性能下降。
3 查询限制
索引不能被以下的查询使用: 正则表达式(最左匹配除外)及非操作符,如 $nin, $not, 等。 算术运算符,如 $mod, 等。 所以,检测你的语句是否使用索引是一个好的习惯,可以用 explain 来查看。
4 最大范围
集合中索引不能超过 64 个 索引名的长度不能超过 128 个字符 一个复合索引最多可以有 31 个字段