🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 一 show和help命令 ```sh #显示数据库列表 show dbs show databases #显示库中的集合 show tables show collections #显示当前用户 show users #显示帮助信息 db.help() 显示数据库操作命令 db.foo.help() 显示集合操作命令,foo代指某个集合 #查找数据 db.foo.find() 查找foo集合中所有数据,默认一次新手20条 db.foo.find({a:1}) 查找集合中a=1的数据 db.foo.find().pretty() 格式化输出的数据 db.log.findOne() 查看第1条记录 db.log.count() 查询总的记录数 DBQuery.shellBatchSize=50 修改为每页显示50条记录 #查看集合存储信息 db.log.stats() db.log.totalSize() 集合中索引+数据压缩存储之后的大小 db.log.storageSize() 集合中数据压缩存储的大小 ``` ## 二 库表相关命令 mongodb使用数据库之前,不需要事先创建库和表,也不需要指定表结构 直接`use dbname`,如果该库存在则进入,如果不存在,则自动创建 进入不存在的库后,如果未往里面添加数据就退出,则该库自动删除,反之则保留 集合也不需要手动创建,像不存在的集合插入数据后,集合自动创建 ### **A 库相关操作** ```sh #切换数据库 use dbname #查看当前数据库 dbs db.getName() #查看数据库状态 db.stats() #删除当前数据库 db.dropDatabase() #查看当前数据库版本 db.version() #从其他主机上克隆数据库 db.cloneDatabase("10.0.0.11") db.cloneDatabase("mydb", "temp", "127.0.0.1") #修复数据库 db.repairDatabase() ``` ### **B 集合相关操作** ```sh #查看当前库下的所有集合 show collections db.getCollectionNames() #创建集合(非必须) db.createCollection('a') #向集合插入数据(集合不存在则创建) db.stu.insert({id:102,name:"lisi"}) #查询集合中的数据 db.stu.find({}).pretty() db.stu.find({id:101}).pretty() #集合重命名 db.stu.renameCollection("abc") #集合删除 db.abc.drop() 删除集合 db.log.remove({}) 删除集合中所有记录 ``` ## 三 数据增删改 ### **插入数据** 语法: `db.集合名称.insert(document)` * 插⼊⽂档时, 如果不指定`_id`参数, MongoDB会为⽂档分配⼀个唯⼀的ObjectId类型的`_id` * 插入单条数据使用字典, 插入多条数据使用列表 ```sh > db.abc.insert({name:'luogang',age:22}) > db.abc.find().pretty() { "_id" : ObjectId("5def4d765feff0d32634b2a7"), "name" : "luogang", "age" : 22 } #批量插入数据 for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":newDate()})} ``` ### **修改数据** 语法: `db.集合名称.update(<query> ,<update>,{multi: <boolean>})` * 参数query:查询条件 * 参数update:更新一条数据,加`$set`表示未更新数据保留,否则未更新数据丢弃 * 参数multi:可选, 默认false只更新找到的第⼀条记录,true表示把满⾜条件的⽂档全部更新 ``` > db.abc.update({name:'luogang'},{$set:{passwd:'123456'}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.abc.find().pretty() { "_id" : ObjectId("5def4d765feff0d32634b2a7"), "name" : "luogang", "age" : 22, "passwd" : "123456" } ``` ### **删除数据** 语法: `db.集合名称.remove(<query>,{justOne: <boolean>})` * 参数query:可选,删除的⽂档的条件,不加条件删除所有记录 * 参数justOne:可选,默认false表示删除多条, true或1则只删除⼀条, ``` > db.abc.remove({name:'luogang'}) WriteResult({ "nRemoved" : 1 }) ``` ## 四 数据查询 语法:`db.表名.find({'key':'value'})` ``` 1、查询所有记录 db.userInfo.find(); 相当于:select* from userInfo; 默认每页显示20条记录,当显示不下的情况下,可以用it迭代命令查询下一页数据。注意:键入it命令不能带“;” 但是你可以设置每页显示数据的大小,用DBQuery.shellBatchSize= 50;这样每页就显示50条记录了。 2、查询去掉后的当前聚集集合中的某列的重复数据 db.userInfo.distinct("name"); 会过滤掉name中的相同数据 相当于:select distict name from userInfo; 3、查询age = 22的记录 db.userInfo.find({"age": 22}); 相当于: select * from userInfo where age = 22; 4、查询age > 22的记录 db.userInfo.find({age: {$gt: 22}}); 相当于:select * from userInfo where age >22; 5、查询age < 22的记录 db.userInfo.find({age: {$lt: 22}}); 相当于:select * from userInfo where age <22; 6、查询age >= 25的记录 db.userInfo.find({age: {$gte: 25}}); 相当于:select * from userInfo where age >= 25; 7、查询age <= 25的记录 db.userInfo.find({age: {$lte: 25}}); 8、查询age >= 23 并且 age <= 26 db.userInfo.find({age: {$gte: 23, $lte: 26}}); 9、查询name中包含 mongo的数据 db.userInfo.find({name: /mongo/}); //相当于%% select * from userInfo where name like ‘%mongo%’; 10、查询name中以mongo开头的 db.userInfo.find({name: /^mongo/}); select * from userInfo where name like ‘mongo%’; 11、查询指定列name、age数据 db.userInfo.find({}, {name: 1, age: 1}); 相当于:select name, age from userInfo; 当然name也可以用true或false,当用ture的情况下河name:1效果一样,如果用false就是排除name,显示name以外的列信息。 12、查询指定列name、age数据, age > 25 db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1}); 相当于:select name, age from userInfo where age >25; 13、按照年龄排序 升序:db.userInfo.find().sort({age: 1}); 降序:db.userInfo.find().sort({age: -1}); 14、查询name = zhangsan, age = 22的数据 db.userInfo.find({name: 'zhangsan', age: 22}); 相当于:select * from userInfo where name = ‘zhangsan’ and age = ‘22’; 15、查询前5条数据 db.userInfo.find().limit(5); 相当于:selecttop 5 * from userInfo; 16、查询10条以后的数据 db.userInfo.find().skip(10); 相当于:select * from userInfo where id not in ( selecttop 10 * from userInfo ); 17、查询在5-10之间的数据 db.userInfo.find().limit(10).skip(5); 可用于分页,limit是pageSize,skip是第几页*pageSize 18、or与 查询 db.userInfo.find({$or: [{age: 22}, {age: 25}]}); 相当于:select * from userInfo where age = 22 or age = 25; 19、查询第一条数据 db.userInfo.findOne(); 相当于:selecttop 1 * from userInfo; db.userInfo.find().limit(1); 20、查询某个结果集的记录条数 db.userInfo.find({age: {$gte: 25}}).count(); 相当于:select count(*) from userInfo where age >= 20; 21、按照某列进行排序 db.userInfo.find({sex: {$exists: true}}).count(); 相当于:select count(sex) from userInfo; ``` ## 五 索引相关命令 ```sh 1、创建索引 db.userInfo.ensureIndex({name: 1}); db.userInfo.ensureIndex({name: 1, ts: -1}); 2、查询当前聚集集合所有索引 db.userInfo.getIndexes(); 3、查看总索引记录大小 db.userInfo.totalIndexSize(); 4、读取当前集合的所有index信息 db.users.reIndex(); 5、删除指定索引 db.users.dropIndex("name_1"); 6、删除所有索引索引 db.users.dropIndexes(); ``` ## 附 语句块操作命令 ``` 1、简单Hello World print("Hello World!"); 这种写法调用了print函数,和直接写入"Hello World!"的效果是一样的; 2、将一个对象转换成json tojson(new Object()); tojson(new Object('a')); 3、循环添加数据 > for (var i = 0; i < 30; i++) { ... db.users.save({name: "u_" + i, age: 22 + i, sex: i % 2}); ... }; 这样就循环添加了30条数据,同样也可以省略括号的写法 > for (var i = 0; i < 30; i++) db.users.save({name: "u_" + i, age: 22 + i, sex: i % 2}); 也是可以的,当你用db.users.find()查询的时候,显示多条数据而无法一页显示的情况下,可以用it查看下一页的信息; 4、find 游标查询 >var cursor = db.users.find(); > while (cursor.hasNext()) { printjson(cursor.next()); } 这样就查询所有的users信息,同样可以这样写 var cursor = db.users.find(); while (cursor.hasNext()) { printjson(cursor.next); } 同样可以省略{}号 5、forEach迭代循环 db.users.find().forEach(printjson); forEach中必须传递一个函数来处理每条迭代的数据信息 6、将find游标当数组处理 var cursor = db.users.find(); cursor[4]; 取得下标索引为4的那条数据 既然可以当做数组处理,那么就可以获得它的长度:cursor.length();或者cursor.count(); 那样我们也可以用循环显示数据 for (var i = 0, len = c.length(); i < len; i++) printjson(c[i]); 7、将find游标转换成数组 > var arr = db.users.find().toArray(); > printjson(arr[2]); 用toArray方法将其转换为数组 8、定制我们自己的查询结果 只显示age <= 28的并且只显示age这列数据 db.users.find({age: {$lte: 28}}, {age: 1}).forEach(printjson); db.users.find({age: {$lte: 28}}, {age: true}).forEach(printjson); 排除age的列 db.users.find({age: {$lte: 28}}, {age: false}).forEach(printjson); 9、forEach传递函数显示信息 db.things.find({x:4}).forEach(function(x) {print(tojson(x));}); ```