一、实验概述本实验聚焦MongoDB命令行操作涵盖数据库管理、集合操作、文档的增删改查以及索引创建等核心内容。通过实际操作深入理解MongoDB文档型存储的灵活性提升非关系型数据库的操作能力。二、数据库操作2.1 查看数据库使用show dbs命令查看当前所有数据库show dbs admin0.000GB// 权限数据库local0.000GB// 本地数据库不复制test0.000GB// 默认测试数据库注意没有插入数据的自定义数据库不会显示在列表中。2.2 创建/切换数据库使用use命令创建或切换数据库use myDB switched to db myDB如果数据库不存在MongoDB会在第一次插入数据时自动创建。2.3 统计数据库信息使用stats()方法查看数据库统计信息use myDBdb.stats(){db:myDB,collections:2,views:0,objects:5,avgObjSize:59.2,dataSize:296,storageSize:32768,numExtents:0,indexes:2,indexSize:32768,scaleFactor:1,fsUsedSize:0,fsTotalSize:0,ok:1}2.4 删除数据库db.dropDatabase(){dropped:myDB,ok:1}三、集合操作3.1 查看集合use testdb.getCollectionNames()[students,orders]show collections students orders3.2 显式创建集合使用createCollection()方法显式创建集合db.createCollection(students){ok:1}带参数的创建固定大小集合db.createCollection(log,{capped:true,size:1024,max:100})参数类型说明cappedBoolean启用固定大小集合达到上限自动覆盖最旧条目sizeNumber上限集合的最大大小字节maxNumber上限集合中允许的最大文档数3.3 隐式创建集合当插入文档时如果集合不存在MongoDB会自动创建db.students.insert({name:张三,age:20})WriteResult({nInserted:1})show collections students3.4 其他集合操作// 重命名集合db.myDB.renameCollection(orders2014){ok:1}// 删除集合db.orders2014.drop()true四、文档操作4.1 插入文档单条插入db.students.insert({name:张三,age:20,major:计算机科学})WriteResult({nInserted:1})批量插入db.students.insertMany([{name:李四,age:21,major:软件工程},{name:王五,age:19,major:数据科学},{name:赵六,age:22,major:人工智能}]){acknowledged:true,insertedIds:[ObjectId(5ba7342c7f9318ea62161352),ObjectId(5ba7342c7f9318ea62161353),ObjectId(5ba7342c7f9318ea62161354)]}指定 _id 插入db.students.insert({_id:1001,name:孙七,age:23})WriteResult({nInserted:1})变量方式插入vardoc{name:周八,age:24,score:85}db.students.insert(doc)WriteResult({nInserted:1})4.2 有序与无序插入ordered: true默认遇到_id重复时停止后续插入db.students.insertMany([{_id:1,name:A},{_id:1,name:B},// 重复报错{_id:3,name:C}// 不再插入],{ordered:true})// 结果仅插入第一条后续终止ordered: false跳过错误文档继续插入其他文档db.students.insertMany([{_id:1,name:A},{_id:1,name:B},// 重复跳过{_id:3,name:C}// 继续插入],{ordered:false})// 结果插入第1条和第3条4.3 更新文档update() 方法// 更新单条文档默认只更新第一条匹配db.students.update({name:张三},{$set:{age:21}})WriteResult({nMatched:1,nUpserted:0,nModified:1})// 更新多条文档db.students.update({major:计算机科学},{$set:{score:90}},{multi:true})// 不存在则插入upsertdb.students.update({name:钱九},{$set:{age:25,major:网络安全}},{upsert:true})save() 方法// 若 _id 存在则更新不存在则插入db.students.save({_id:1001,name:孙七,age:24,major:大数据})WriteResult({nMatched:1,nUpserted:0,nModified:1})4.4 删除文档// 删除所有文档db.students.deleteMany({}){acknowledged:true,deletedCount:5}// 删除符合条件的所有文档db.students.deleteMany({status:A}){acknowledged:true,deletedCount:2}// 删除符合条件的一条文档db.students.deleteOne({status:D}){acknowledged:true,deletedCount:1}注意remove()方法已不推荐使用官方建议使用deleteOne()和deleteMany()。五、查询操作5.1 基本查询// 查询所有文档db.students.find()// 格式化输出db.students.find().pretty()// 条件查询db.students.find({age:20})// 多条件查询ANDdb.students.find({name:张三,age:20})5.2 条件操作符操作语法示例等价SQL等于{key:value}db.test.find({price:24})WHERE price24大于{key:{$gt:value}}db.test.find({price:{$gt:24}})WHERE price24小于{key:{$lt:value}}db.test.find({price:{$lt:24}})WHERE price24大于等于{key:{$gte:value}}db.test.find({price:{$gte:24}})WHERE price24小于等于{key:{$lte:value}}db.test.find({price:{$lte:24}})WHERE price24不等于{key:{$ne:value}}db.test.find({price:{$ne:24}})WHERE price!24OR{$or:[...]}db.test.find({$or:[{name:A},{price:24}]})WHERE nameA OR price245.3 特定类型查询// 查询 age 为 null 的文档db.test.find({age:null})// 查询数组包含特定元素db.test.find({tags:MongoDB})5.4 游标操作// 获取游标varcursordb.students.find()// 遍历游标while(cursor.hasNext()){...printjson(cursor.next())...}// 常用游标方法db.students.find().count()// 统计数量db.students.find().limit(5)// 限制返回5条db.students.find().skip(10)// 跳过前10条db.students.find().sort({age:-1})// 按age降序排序db.students.find().toArray()// 转为数组游标生命周期创建执行find()时在服务器端创建销毁条件客户端游标变量超出作用域游标遍历完成或客户端主动终止服务器端10分钟内未操作六、索引操作6.1 创建单键索引db.students.createIndex({score:1}){createdCollectionAutomatically:false,numIndexesBefore:1,numIndexesAfter:2,ok:1}1表示升序-1表示降序。6.2 查看索引// 查看集合索引db.students.getIndexes()// 查看数据库所有索引db.getCollectionNames().forEach(function(collection){...print(Indexes for collection:);...printjson(db[collection].getIndexes());...})6.3 查询性能分析使用索引字段查询db.students.find({score:{$gt:80}}).explain(executionStats)输出关键信息stage : IXSCAN—— 索引扫描indexName : score_1—— 使用了score索引totalDocsExamined—— 检查的文档数较少不使用索引字段查询db.students.find({name:张三}).explain(executionStats)输出关键信息stage : COLLSCAN—— 全集合扫描totalDocsExamined—— 检查的文档数较多6.4 删除索引// 删除指定索引db.students.dropIndex(score_1)// 删除所有索引保留 _id 索引db.students.dropIndexes()七、附录常用命令速查表操作类别命令说明数据库use dbname切换/创建数据库数据库show dbs查看所有数据库数据库db.stats()查看数据库统计数据库db.dropDatabase()删除当前数据库集合db.createCollection(name)显式创建集合集合show collections查看所有集合集合db.collection.drop()删除集合文档db.col.insert(doc)插入文档文档db.col.insertMany(docs)批量插入文档db.col.update(query,update)更新文档文档db.col.deleteOne(query)删除单条文档db.col.deleteMany(query)删除多条查询db.col.find(query)查询文档查询db.col.find().pretty()格式化输出索引db.col.createIndex({key:1})创建索引索引db.col.getIndexes()查看索引索引db.col.dropIndex(name)删除索引索引db.col.explain()查询执行计划
MongoDB编程实践:数据库、集合与文档操作详解
一、实验概述本实验聚焦MongoDB命令行操作涵盖数据库管理、集合操作、文档的增删改查以及索引创建等核心内容。通过实际操作深入理解MongoDB文档型存储的灵活性提升非关系型数据库的操作能力。二、数据库操作2.1 查看数据库使用show dbs命令查看当前所有数据库show dbs admin0.000GB// 权限数据库local0.000GB// 本地数据库不复制test0.000GB// 默认测试数据库注意没有插入数据的自定义数据库不会显示在列表中。2.2 创建/切换数据库使用use命令创建或切换数据库use myDB switched to db myDB如果数据库不存在MongoDB会在第一次插入数据时自动创建。2.3 统计数据库信息使用stats()方法查看数据库统计信息use myDBdb.stats(){db:myDB,collections:2,views:0,objects:5,avgObjSize:59.2,dataSize:296,storageSize:32768,numExtents:0,indexes:2,indexSize:32768,scaleFactor:1,fsUsedSize:0,fsTotalSize:0,ok:1}2.4 删除数据库db.dropDatabase(){dropped:myDB,ok:1}三、集合操作3.1 查看集合use testdb.getCollectionNames()[students,orders]show collections students orders3.2 显式创建集合使用createCollection()方法显式创建集合db.createCollection(students){ok:1}带参数的创建固定大小集合db.createCollection(log,{capped:true,size:1024,max:100})参数类型说明cappedBoolean启用固定大小集合达到上限自动覆盖最旧条目sizeNumber上限集合的最大大小字节maxNumber上限集合中允许的最大文档数3.3 隐式创建集合当插入文档时如果集合不存在MongoDB会自动创建db.students.insert({name:张三,age:20})WriteResult({nInserted:1})show collections students3.4 其他集合操作// 重命名集合db.myDB.renameCollection(orders2014){ok:1}// 删除集合db.orders2014.drop()true四、文档操作4.1 插入文档单条插入db.students.insert({name:张三,age:20,major:计算机科学})WriteResult({nInserted:1})批量插入db.students.insertMany([{name:李四,age:21,major:软件工程},{name:王五,age:19,major:数据科学},{name:赵六,age:22,major:人工智能}]){acknowledged:true,insertedIds:[ObjectId(5ba7342c7f9318ea62161352),ObjectId(5ba7342c7f9318ea62161353),ObjectId(5ba7342c7f9318ea62161354)]}指定 _id 插入db.students.insert({_id:1001,name:孙七,age:23})WriteResult({nInserted:1})变量方式插入vardoc{name:周八,age:24,score:85}db.students.insert(doc)WriteResult({nInserted:1})4.2 有序与无序插入ordered: true默认遇到_id重复时停止后续插入db.students.insertMany([{_id:1,name:A},{_id:1,name:B},// 重复报错{_id:3,name:C}// 不再插入],{ordered:true})// 结果仅插入第一条后续终止ordered: false跳过错误文档继续插入其他文档db.students.insertMany([{_id:1,name:A},{_id:1,name:B},// 重复跳过{_id:3,name:C}// 继续插入],{ordered:false})// 结果插入第1条和第3条4.3 更新文档update() 方法// 更新单条文档默认只更新第一条匹配db.students.update({name:张三},{$set:{age:21}})WriteResult({nMatched:1,nUpserted:0,nModified:1})// 更新多条文档db.students.update({major:计算机科学},{$set:{score:90}},{multi:true})// 不存在则插入upsertdb.students.update({name:钱九},{$set:{age:25,major:网络安全}},{upsert:true})save() 方法// 若 _id 存在则更新不存在则插入db.students.save({_id:1001,name:孙七,age:24,major:大数据})WriteResult({nMatched:1,nUpserted:0,nModified:1})4.4 删除文档// 删除所有文档db.students.deleteMany({}){acknowledged:true,deletedCount:5}// 删除符合条件的所有文档db.students.deleteMany({status:A}){acknowledged:true,deletedCount:2}// 删除符合条件的一条文档db.students.deleteOne({status:D}){acknowledged:true,deletedCount:1}注意remove()方法已不推荐使用官方建议使用deleteOne()和deleteMany()。五、查询操作5.1 基本查询// 查询所有文档db.students.find()// 格式化输出db.students.find().pretty()// 条件查询db.students.find({age:20})// 多条件查询ANDdb.students.find({name:张三,age:20})5.2 条件操作符操作语法示例等价SQL等于{key:value}db.test.find({price:24})WHERE price24大于{key:{$gt:value}}db.test.find({price:{$gt:24}})WHERE price24小于{key:{$lt:value}}db.test.find({price:{$lt:24}})WHERE price24大于等于{key:{$gte:value}}db.test.find({price:{$gte:24}})WHERE price24小于等于{key:{$lte:value}}db.test.find({price:{$lte:24}})WHERE price24不等于{key:{$ne:value}}db.test.find({price:{$ne:24}})WHERE price!24OR{$or:[...]}db.test.find({$or:[{name:A},{price:24}]})WHERE nameA OR price245.3 特定类型查询// 查询 age 为 null 的文档db.test.find({age:null})// 查询数组包含特定元素db.test.find({tags:MongoDB})5.4 游标操作// 获取游标varcursordb.students.find()// 遍历游标while(cursor.hasNext()){...printjson(cursor.next())...}// 常用游标方法db.students.find().count()// 统计数量db.students.find().limit(5)// 限制返回5条db.students.find().skip(10)// 跳过前10条db.students.find().sort({age:-1})// 按age降序排序db.students.find().toArray()// 转为数组游标生命周期创建执行find()时在服务器端创建销毁条件客户端游标变量超出作用域游标遍历完成或客户端主动终止服务器端10分钟内未操作六、索引操作6.1 创建单键索引db.students.createIndex({score:1}){createdCollectionAutomatically:false,numIndexesBefore:1,numIndexesAfter:2,ok:1}1表示升序-1表示降序。6.2 查看索引// 查看集合索引db.students.getIndexes()// 查看数据库所有索引db.getCollectionNames().forEach(function(collection){...print(Indexes for collection:);...printjson(db[collection].getIndexes());...})6.3 查询性能分析使用索引字段查询db.students.find({score:{$gt:80}}).explain(executionStats)输出关键信息stage : IXSCAN—— 索引扫描indexName : score_1—— 使用了score索引totalDocsExamined—— 检查的文档数较少不使用索引字段查询db.students.find({name:张三}).explain(executionStats)输出关键信息stage : COLLSCAN—— 全集合扫描totalDocsExamined—— 检查的文档数较多6.4 删除索引// 删除指定索引db.students.dropIndex(score_1)// 删除所有索引保留 _id 索引db.students.dropIndexes()七、附录常用命令速查表操作类别命令说明数据库use dbname切换/创建数据库数据库show dbs查看所有数据库数据库db.stats()查看数据库统计数据库db.dropDatabase()删除当前数据库集合db.createCollection(name)显式创建集合集合show collections查看所有集合集合db.collection.drop()删除集合文档db.col.insert(doc)插入文档文档db.col.insertMany(docs)批量插入文档db.col.update(query,update)更新文档文档db.col.deleteOne(query)删除单条文档db.col.deleteMany(query)删除多条查询db.col.find(query)查询文档查询db.col.find().pretty()格式化输出索引db.col.createIndex({key:1})创建索引索引db.col.getIndexes()查看索引索引db.col.dropIndex(name)删除索引索引db.col.explain()查询执行计划