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"}}))。
remove函数:
空条件删除全部文档(如db.stus.remove({}))。
带条件删除匹配文档(如db.stus.remove({'age':{'$gt':20}}, true)仅删除第一个匹配项)。
deleteOne函数:删除第一个匹配文档(如db.stus.deleteOne({'name':'zhangsan'}))。
deleteMany函数:删除所有匹配文档(如db.stus.deleteMany({'age':{'$gt':10}}))。
find():返回所有匹配文档(如db.stu.find({},{'name':0})隐藏name字段)。
findOne():返回第一个匹配文档(如db.stu.findOne({},{'name':1})仅显示name字段)。
比较运算符:$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降序排列。
单字段索引:如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等操作无法使用索引。