252尚学堂百战程序员103天

252尚学堂百战程序员103天
最新回答
局外亾

2022-10-15 13:16:21

在252尚学堂百战程序员第103天关于MongoDB的学习中,核心内容涵盖文档操作、条件查询、索引管理及性能优化,具体知识点总结如下

一、MongoDB文档更新操作
  • 更新方式

    update函数:支持覆盖更新(整体替换文档)和表达式更新(通过操作符修改字段)。

    save函数:根据_id字段判断文档是否存在,存在则覆盖,不存在则新增。

  • 更新操作符

    $set:修改或新增字段(如db.stu.update({name:"zhangsan"},{$set:{'age':23}}))。

    $inc:对数字字段增减(如db.stu.update({name:"zhangsan"},{$inc:{age:5}}))。

    $unset:删除字段(如db.stu.update({name:"zhangsan"},{$unset:{age:1}}))。

    数组操作符

    $push:向数组追加值(如db.stu.update({name:"zhangsan"},{$push:{"alias":"xiaozhang"}}))。

    $pop:删除数组首尾元素(1为尾,-1为首)。

    $pull/$pullAll:删除匹配值或多个值(如db.stu.update({name:"zhangsan"},{$pull:{"alias":"xiaozhang"}}))。

    $addToSet:仅当值不存在时添加到数组。

    $rename:重命名字段(如db.stu.update({name:"zhangsan"},{$rename:{"name":"sname"}}))。

二、MongoDB文档删除操作
  • 删除方式

    remove函数

    空条件删除全部文档(如db.stus.remove({}))。

    带条件删除匹配文档(如db.stus.remove({'age':{'$gt':20}}, true)仅删除第一个匹配项)。

    deleteOne函数:删除第一个匹配文档(如db.stus.deleteOne({'name':'zhangsan'}))。

    deleteMany函数:删除所有匹配文档(如db.stus.deleteMany({'age':{'$gt':10}}))。

三、MongoDB文档查询操作
  • 基础查询

    find():返回所有匹配文档(如db.stu.find({},{'name':0})隐藏name字段)。

    findOne():返回第一个匹配文档(如db.stu.findOne({},{'name':1})仅显示name字段)。

  • 投影操作:通过第二个参数控制返回字段(如db.stu.find({},{title:1,size:0}))。
  • 条件运算符

    比较运算符:$gt(大于)、$lt(小于)、$eq(等于)、$ne(不等于)。

    逻辑运算符

    $and:多条件同时满足(如db.stu.find({$and:[{age:20},{score:90}]}))。

    $or:多条件任一满足(如db.stu.find({$or:[{age:20},{score:90}]}))。

    混合使用:如db.stu.find({$or:[{$and:[{age:20},{score:90}]},{gender:'M'}]})。

  • 分页与排序

    分页:skip(20).limit(5)跳过20条,返回5条(第5页数据)。

    排序:sort({age:1, score:-1})按age升序、score降序排列。

四、MongoDB索引管理
  • 索引类型

    单字段索引:如db.stu.ensureIndex({'age':1})。

    复合索引:多字段组合(如db.stu.ensureIndex({'age':1, 'name':1}))。

    唯一索引:确保字段值唯一(如db.stu.ensureIndex({'name':1},{unique:true}))。

    部分索引:仅对满足条件的文档建索引(如db.stu.createIndex({'name':1},{partialFilterExpression:{age:{$gt:25}}}))。

    覆盖索引:查询仅通过索引返回字段(如db.stu.find({gender:"M"},{user_name:1,_id:0}))。

  • 索引操作

    创建:createIndex()或ensureIndex()。

    查看:getIndexes()。

    删除:dropIndex('索引名')或dropIndexes()删除所有自建索引。

  • 索引优化原则

    避免过度建索引:索引会占用存储空间并增加写入负担,记录数少于2000的表可不建索引。

    选择性评估:索引选择性(不重复值/记录数)低时,建索引收益低。

    限制条件

    索引名长度不超过128字符,复合索引最多31个字段。

    集合索引数不超过64个。

    正则表达式(除最左匹配)、$nin、$not等操作无法使用索引。

五、性能优化与扩展思考
  • 索引代价:索引虽加速查询,但会降低写入性能(插入、更新、删除需维护索引)。
  • 内存限制:索引存储在内存中,需确保索引大小不超过可用内存,否则MongoDB会删除部分索引导致性能下降。
  • 查询检测:使用explain()分析查询是否使用索引。
  • 教学建议:通过点名提问回顾知识点(如从第一节课到最后一节课的核心内容),确保学生掌握文档操作、条件查询、索引管理等全流程。