# miniMongoDB **Repository Path**: LiuDan1119/miniMongoDB ## Basic Information - **Project Name**: miniMongoDB - **Description**: mini版mongoDB数据库实现 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2017-04-05 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## MongoDb ##使用方式请参考项目中TestCase **启动链接命令:** * 启动命令:mongod --dbpath data/db * 链接命令:mongo 127.0.0.1:27017/admin **文档命令** * use dbname --新建数据库 * db.drop() --删除 * show dbs --显示 * show collections --显示数据库的集合 * 批量插入数据: ``` //批量插入 for(var i=0;i<10;i++) { db.persions.insert({name:i}) } //查询 db.persions.find() ``` * insert 和 save的区别(insert是插入,如果有重复的则报错,save如果有重复的,则执行更新操作) ``` { "_id" : "001", "name" : 100 } db.persions.insert({"_id":"001",name:111}) 执行结果: WriteResult({ "nInserted" : 0, "writeError" : { "code" : 11000, "errmsg" : "E11000 duplicate key error collection: foobar.persions index: _id_ dup key: { : \"001\" }" }}) db.persions.save({"_id":"001",name:111}) 执行结果: WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) { "_id" : "001", "name" : 111 } ``` **修改器** * $set 修改器用来指定一个键值,如果存在,则修改,不存在,则创建。 ``` //修改前:{ "_id" : "001", "name" : 111 } db.persions.update({"name":"111"},{"$set":{"age":20}}) //修改后:{ "_id" : "001", "name" : 111, "age" : 20 } //批量修改 db.persons.update({country:"China"},{$set:{sex:"M"}},false,true) ``` * $inc 修改器用来指定一个键值,如果存在则修改,不存在则创建。(可用于主键自增) ``` //修改前数据{ "_id" : "001", "name" : 111, "age" : 20 } db.persions.update({name:111},{$inc:{age:1}}) //修改后数据 { "_id" : "001", "name" : 111, "age" : 21 } ``` * $unset 修改器用来删除指定键 ``` //执行前有数据 { "_id" : ObjectId("58ce993b5bc83f2fd0964f25"), "name" : "liu" } db.persions.update({name:"liu"},{$unset:{name:1}}) //执行后数据消失 ``` * $push 数组修改器数组修改器,顾名思义它只可以用于操作数组,只能用在值为数组的键上。修改器如果指定的值已经存在,"push"会想已有的数组末尾加入一个元素,要是没有就会创建一个新的数组。 ``` //执行插入一条数据 db.persions.insert({"_id":002,name:"002",books:[]}) //调用push db.persions.update({"_id:2},{$push:{books:"js"}}}) db.persions.update({"_id":2},{$push:{books:"jeasyui"}}) //查询 { "_id" : 2, "name" : "002", "books" : [ "js", "jeasyui" ] } ``` **查询** * Find 1. 查询指定的返回字段 语法:db.[documentName].find({条件},{键指定}) ```` //0代表不查询,1代表查询 第一个{}代表查询所有 db.persons.find({},{_id:0,name:1,email:1}) //结果 { "name" : "jim", "email" : "75431457@qq.com" } { "name" : "tom", "email" : "214557457@qq.com" } { "name" : "lili", "email" : "344521457@qq.com" } ```` 2. 查询条件 $lt < $lte <= $gt > $gte >= $ne != 例如:{age:{$gte:22,$lte:27}} ``` //1. 条件查询 //查询年龄 >=21 and <=23 db.persons.find({age:{$gte:21,$lte:23}},{_id:0,name:1,age:1,email:1}) { "name" : "lixiaoli", "age" : 21, "email" : "lixiaoli@uspcat.com" } { "name" : "zhangsuying", "age" : 22, "email" : "zhangsuying@uspcat.com" } //查询不是韩国学生的数学成绩 db.persons.find({country:{$ne:"Korea"}},{_id:0,name:1,age:1,m:1,country:1}) { "name" : "jim", "age" : 25, "m" : 96, "country" : "USA" } { "name" : "tom", "age" : 25, "m" : 66, "country" : "USA" } { "name" : "lili", "age" : 26, "m" : 63, "country" : "USA" } { "name" : "zhangsan", "age" : 27, "m" : 86, "country" : "China" } { "name" : "lisi", "age" : 26, "m" : 96, "country" : "China" } { "name" : "wangwu", "age" : 27, "m" : 65, "country" : "China" } { "name" : "zhaoliu", "age" : 27, "m" : 96, "country" : "China" } // 2. 包含或不包含 //查询出包含美国跟中国的学生 db.persons.find({country:{$in:["USA","China"]}},{_id:0,name:1,age:1,m:1,country:1}) { "name" : "jim", "age" : 25, "m" : 96, "country" : "USA" } { "name" : "tom", "age" : 25, "m" : 66, "country" : "USA" } { "name" : "lili", "age" : 26, "m" : 63, "country" : "USA" } { "name" : "zhangsan", "age" : 27, "m" : 86, "country" : "China" } { "name" : "lisi", "age" : 26, "m" : 96, "country" : "China" } { "name" : "wangwu", "age" : 27, "m" : 65, "country" : "China" } { "name" : "zhaoliu", "age" : 27, "m" : 96, "country" : "China" } //查询不包含中国跟美国的学生 db.persons.find({country:{$nin:["USA","China"]}},{_id:0,name:1,age:1,m:1,country:1}) { "name" : "piaoyingjun", "age" : 26, "m" : 54, "country" : "Korea" } { "name" : "lizhenxian", "age" : 27, "m" : 56, "country" : "Korea" } { "name" : "lixiaoli", "age" : 21, "m" : 86, "country" : "Korea" } { "name" : "zhangsuying", "age" : 22, "m" : 63, "country" : "Korea" } // 查询语文大于85 英语小于97的学生 db.persons.find({$or:[{c:{$gt:85},e:{$lt:97}}]},{_id:0,name:1,c:1,e:1}) { "name" : "jim", "c" : 89, "e" : 87 } { "name" : "zhangsan", "c" : 89, "e" : 67 } //查询sex为null的学生 db.persons.find({sex:{$in:[null]}},{_id:0,name:1,sex:1}) { "name" : "jim" } { "name" : "tom" } { "name" : "lili" } { "name" : "piaoyingjun" } { "name" : "lizhenxian" } { "name" : "lixiaoli" } { "name" : "zhangsuying" } //正则查询 /li/i db.persons.find({name:/li/i},{_id:0,name:1,email:1}) { "name" : "lili", "email" : "344521457@qq.com" } { "name" : "lisi", "email" : "274521457@qq.com" } { "name" : "zhaoliu", "email" : "214521457@qq.com" } { "name" : "lizhenxian", "email" : "lizhenxian@uspcat.com" } { "name" : "lixiaoli", "email" : "lixiaoli@uspcat.com" } //$not可以用到任何地方进行取反 db.persons.find({name:{$not:/li/i}},{_id:0,name:1,email:1}) { "name" : "jim", "email" : "75431457@qq.com" } { "name" : "tom", "email" : "214557457@qq.com" } { "name" : "zhangsan", "email" : "2145567457@qq.com" } { "name" : "wangwu", "email" : "65621457@qq.com" } { "name" : "piaoyingjun", "email" : "piaoyingjun@uspcat.com" } { "name" : "zhangsuying", "email" : "zhangsuying@uspcat.com" } //数组查询$all db.persons.find({books:{$all:["JS"]}},{_id:0,name:1,email:1}) { "name" : "jim", "email" : "75431457@qq.com" } { "name" : "lili", "email" : "344521457@qq.com" } { "name" : "zhangsan", "email" : "2145567457@qq.com" } { "name" : "lisi", "email" : "274521457@qq.com" } { "name" : "wangwu", "email" : "65621457@qq.com" } { "name" : "zhaoliu", "email" : "214521457@qq.com" } { "name" : "piaoyingjun", "email" : "piaoyingjun@uspcat.com" } { "name" : "lizhenxian", "email" : "lizhenxian@uspcat.com" } { "name" : "lixiaoli", "email" : "lixiaoli@uspcat.com" } { "name" : "zhangsuying", "email" : "zhangsuying@uspcat.com" } //$elemMatch数组对象查询 db.persons.find({school:{$elemMatch:{school:"K",score:"A"}}},{_id:0,name:1,email:1}) { "name" : "jim", "email" : "75431457@qq.com" } $where万能的查询语句 db.persons.find({"$where":function(){ //得到查询结果的每一条文档 var books = this.books; //得到文档中的school对象 var school = this.school; //如果年纪>=22 if(this.age > 22){ var php = null; //遍历书籍 for ( var i = 0; i < books.length; i++) { if(books[i] == "C++"){ php = books[i]; //如果学校是真 if(school){ for (var j = 0; j < school.length; j++) { //判断是不是在K上学 if(school[j].school == "K"){ //返回是真 return true; } } break; } } } } }}) { "_id" : ObjectId("58de7dc6a724a9151e4b9d82"), "name" : "jim", "age" : 25, "email" : "75431457@qq.com", "c" : 89, "m" : 96, "e" : 87, "country" : "USA", "books" : [ "JS", "C++", "EXTJS", "MONGODB" ], "school" : [ { "school" : "K", "score" : "A" }, { "school" : "L", "score" : "B" }, { "school" : "J", "score" : "A+" } ] } //$limit 分页查询 > db.persons.find({},{_id:0,name:1,email:1}).limit(5) { "name" : "jim", "email" : "75431457@qq.com" } { "name" : "tom", "email" : "214557457@qq.com" } { "name" : "lili", "email" : "344521457@qq.com" } { "name" : "zhangsan", "email" : "2145567457@qq.com" } { "name" : "lisi", "email" : "274521457@qq.com" } //$skip()跳跃查询,(从第几条开始查询) db.persons.find({},{_id:0,name:1,email:1}).limit(5).skip(5) { "name" : "wangwu", "email" : "65621457@qq.com" } { "name" : "zhaoliu", "email" : "214521457@qq.com" } { "name" : "piaoyingjun", "email" : "piaoyingjun@uspcat.com" } { "name" : "lizhenxian", "email" : "lizhenxian@uspcat.com" } { "name" : "lixiaoli", "email" : "lixiaoli@uspcat.com" } //排序.sort(age:1) 1正序,-1倒序 db.persons.find({},{_id:0,name:1,age:1}).limit(5).sort({age:1}) { "name" : "lixiaoli", "age" : 21 } { "name" : "zhangsuying", "age" : 22 } { "name" : "jim", "age" : 25 } { "name" : "tom", "age" : 25 } { "name" : "lili", "age" : 26 } ``` **Mongodb 索引** ```$xslt //插入20万条数据 for(var i=0;i<200000;i++){ db.books.insert({number:i,name:i+"book"}) } var startDate = new Date() db.books.find({number:56789}) var endDate = new Date() endDate-startDate //执行耗时168毫秒 var startDate = new Date() > db.books.find({number:56789}) var endDate = new Date() { "_id" : ObjectId("58df5bd934f75ed79cc5e990"), "number" : 56789, "name" : "56789book" } > var endDate = new Date() > endDate-startDate 168 //为books的number字段创建索引 db.books.ensureIndex({number:1}) //创建索引并且指定索引名称 db.books.ensureIndex({number:1},{name:"bookname"}) //建立完索引只用了2毫秒 var start = new Date() db.books.find({number:65871}) var end = new Date() end - start 2 //详细查看本次查询使用的索引以及查询数据状态信息 db.books.find({name:"0book"}).explain() { "queryPlanner" : { "plannerVersion" : 1, "namespace" : "foobar.books", "indexFilterSet" : false, "parsedQuery" : { "name" : { "$eq" : "0book" } }, "winningPlan" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "name" : 1 }, "indexName" : "name_1", "isMultiKey" : false, "multiKeyPaths" : { "name" : [ ] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 1, "direction" : "forward", "indexBounds" : { "name" : [ "[\"0book\", \"0book\"]" ] } } }, "rejectedPlans" : [ ] }, "serverInfo" : { "host" : "bogon", "port" : 27017, "version" : "3.4.2", "gitVersion" : "3f76e40c105fc223b3e5aac3e20dcd026b83b38b" }, "ok" : 1 } //创建2d集合 > db.map.find() { "_id" : ObjectId("58df75fb310cefc5479014c7"), "gis" : { "x" : 185, "y" : 150 } } { "_id" : ObjectId("58df75fb310cefc5479014c8"), "gis" : { "x" : 70, "y" : 180 } } { "_id" : ObjectId("58df75fb310cefc5479014c9"), "gis" : { "x" : 75, "y" : 180 } } { "_id" : ObjectId("58df75fb310cefc5479014ca"), "gis" : { "x" : 185, "y" : 185 } } { "_id" : ObjectId("58df75fb310cefc5479014cb"), "gis" : { "x" : 65, "y" : 185 } } { "_id" : ObjectId("58df75fb310cefc5479014cc"), "gis" : { "x" : 50, "y" : 50 } } { "_id" : ObjectId("58df75fb310cefc5479014cd"), "gis" : { "x" : 50, "y" : 50 } } { "_id" : ObjectId("58df75fb310cefc5479014ce"), "gis" : { "x" : 60, "y" : 55 } } { "_id" : ObjectId("58df75fb310cefc5479014cf"), "gis" : { "x" : 65, "y" : 80 } } { "_id" : ObjectId("58df75fb310cefc5479014d0"), "gis" : { "x" : 55, "y" : 80 } } { "_id" : ObjectId("58df75fb310cefc5479014d1"), "gis" : { "x" : 0, "y" : 0 } } { "_id" : ObjectId("58df75fb310cefc5479014d2"), "gis" : { "x" : 0, "y" : 200 } } { "_id" : ObjectId("58df75fb310cefc5479014d3"), "gis" : { "x" : 200, "y" : 0 } } { "_id" : ObjectId("58df75fb310cefc5479014d4"), "gis" : { "x" : 200, "y" : 200 } } > db.map.ensureIndex({"gis":"2d"},{min:-1,max:200}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } //2D数组查询,查询70,到80附近到3个点 db.map.find({"gis":{$near:[70,80]}},{_id:0}).limit(3) { "gis" : { "x" : 65, "y" : 80 } } { "gis" : { "x" : 55, "y" : 80 } } { "gis" : { "x" : 60, "y" : 55 } } ``` **常用函数** ```$xslt //查询条数count() db.persons.find({country:"USA"}).count() 3 //数据去重distinct db.runCommand({distinct:"persons",key:"country"}) { "values" : [ "USA", "China", "Korea" ], "ok" : 1 } //查询mongodb所有命令 --rest db.listCommands() 启动命令:mongod --dbpath /Users/liudan/Documents/soft/mogon/data/db --rest //这样才能访问默认端口+1000 http://localhost:28017/_commands //查询系统信息 db.runCommand({buildinfo:1}) ``` ###### 有问题联系,一起交流: > qq:254853183