mongodb 基本操作
1 链接数据库
[root@master-node ~]# mongo ip:port/库名 -u用户名 -p密码mongo 命令直接加MongoDB服务器的IP地址就可以利用 Mongo 的默认端口号(27017)登陆 Mongo,然后便能够进行简单的命令行操作。[root@master-node ~]# mongo
登录数据后可以直接help查看帮助
MongoDB Enterprise > help db.help() help on db methods db.mycoll.help() help on collection methods sh.help() sharding helpers rs.help() replica set helpers help admin administrative help help connect connecting to a db help help keys key shortcuts help misc misc things to know help mr mapreduce show dbs show database names show collections show collections in current database show users show users in current database show profile show most recent system.profile entries with time >= 1ms show logs show the accessible logger names show log [name] prints out the last segment of log in memory, 'global' is default use <db_name> set current database db.mycoll.find() list objects in collection mycoll db.mycoll.find( { a : 1 } ) list objects in mycoll where a == 1 it result of the last line evaluated; use to further iterate DBQuery.shellBatchSize = x set default number of items to display on shell exit quit the mongo shell
database数据库操作
查看所有的数据库
MongoDB Enterprise > show dbs admin 0.000GB config 0.000GB local 0.000GB
切换数据库
MongoDB Enterprise > use wang
switched to db wangmongo 中,db 代表当前使用的数据库。变为现在的 wang 数据库,如果没有这个库,就会自动创建MongoDB Enterprise > show dbs
只有给wang 插入collection 的数据才能查到
MongoDB Enterprise > db.mycoll.insert({name:"xiao",age:23})
admin 0.000GB
config 0.000GB
local 0.000GB
wang 0.000GB
2 删除数据库删除当前所在库。比如这里已经切换到huanqiu库,那么就删除huanku库
MongoDB Enterprise > db.dropDatabase()
{ "dropped" : "wang", "ok" : 1 }
MongoDB Enterprise > show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
查看当前数据库
MongoDB Enterprise > db
wang
MongoDB Enterprise > db.getName()
wang
2.6.2 查看当前数据库状态> db.stats();{ "db" : "wangshibo", "collections" : 3, "views" : 0, "objects" : 6, "avgObjSize" : 75.5, "dataSize" : 453, "storageSize" : 73728, "numExtents" : 0, "indexes" : 4, "indexSize" : 53248, "ok" : 1}2.6.3 当前db版本> db.version();3.4.42.6.4 查看当前db的链接机器地址> db.getMongo();connection to 182.48.115.238:270172.6.5 从指定主机上克隆数据库> db.cloneDatabase("182.48.115.236"); { "clonedColls" : [ ], "ok" : 0, "errmsg" : "a collection 'wangshibo.wangshibo' already exists", "code" : 48, "codeName" : "NamespaceExists"}2.6.6 从指定的机器上复制指定数据库数据到某个数据库将本机的master_slave的数据复制到wangshibo数据库中> db.copyDatabase("master_slave", "wangshibo", "127.0.0.1");{ "ok" : 1 }对collection的操作
新建
> db.createCollection("Hello"){ "ok" : 1 }> show collectionsHellowangshibo直接向一个不存在的 collection 中插入数据也能创建一个 collection。> db.hello2.insert({"name":"lfqy"})WriteResult({ "nInserted" : 1 })> show collectionsHellohello2wangshibo3.2 删除 collection> db.Hello.drop()true返回 true 说明删除成功,false 说明没有删除成功。> db.Hello.drop()false不存在名为 hello 的 collection,因此,删除失败。3.3 重命名 collection将 hello2 集合重命名为 HELLO> show collectionshello2wangshibo> db.hello2.renameCollection("HELLO"){ "ok" : 1 }> show collectionsHELLOwangshibo3.4 查看当前数据库中的所有 collection> show collectionsHELLOwangshibo3.5 建立索引在 HELLO 集合上,建立对 ID 字段的索引,1 代表升序。> db.HELLO.ensureIndex({ID:1}){ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1}数据操作
4.1 查询操作
4.2.1 查找集合中的所有记录
MongoDB Enterprise > db.mycoll.find()
{ "_id" : ObjectId("5f38fe39088ec9cc53e6da21"), "id" : 1, "name" : "xiao", "age" : 20 }
{ "_id" : ObjectId("5f38fe44088ec9cc53e6da22"), "id" : 2, "name" : "long", "age" : 22 }
{ "_id" : ObjectId("5f38fe4c088ec9cc53e6da23"), "id" : 3, "name" : "cui", "age" : 22 }
比较操作:
语法格式 {age:{$gt :30}} 年龄大于30
$gt 大于等于
$lt 小于
$lte 小于等于
$ne 不等于
$in:[20,40] 在
$nin:[20.40] 不在
查询 age 为26 的数据
> db.user.find({"age":26})
查询 salary 大于 7000 的数据
> db.user.find({salary:{$gt:7000}})
查询 name 中包含'ent'的数据> db.user.find({name:/ent/})查询 name 以 G 打头的数据> db.user.find({name:/^G/})查询 name 以 t 结尾的数据> db.user.find({name:/t$/})组合多个条件:
逻辑运算:
$or : 或 {$or:[{条件1},{条件2},{条件3}]}
$and 与
$not 非
$nor 返回不符合条件的所有文档
(2)多条件"与"查询 age 小于 30,salary 大于 7000 的数据> db.user.find({age:{$lt:30},salary:{$gt:7000}})(3)多条件"或"查询 age 小于 30,或者 salary 大于 10000 的记录> db.user.find({$or:[{salary:{$gt:10000}},{age:{$lt:30}}]}).2.3 查询第一条记录将上面的 find 替换为 findOne()可以查找符合条件的第一条记录。> db.user.findOne({$or:[{salary:{$gt:10000}},{age:{$lt:25}}]})4.2.4 查询记录的指定字段查询 user 集合中所有记录的 name,age,salary,sex_orientation 字段> db.user.find({},{name:1,age:1,salary:1,sex_orientation:true})注意:这里的 1 表示显示此列的意思,也可以用 true 表示。> db.user.find({},{name:1,age:1,salary:true,sex_orientation:1})4.2.5 查询指定字段的数据,并去重。查询 gender 字段的数据,并去掉重复数据> db.user.distinct('gender')4.2.6 对查询结果集的操作(1)Pretty Print为了方便,mongo 也提供了 pretty print 工具,db.collection.pretty()或者是 db.collection.forEach(printjson)> db.user.find().pretty()(2)指定结果集显示的条目a)显示结果集中的前 3 条记录> db.user.find().limit(3)b)查询第 1 条以后的所有数据> db.user.find().skip(1)查询跳过前2条以后的所有数据> db.user.find().skip(2)c)对结果集排序升序> db.user.find().sort({salary:1})降序> db.user.find().sort({salary:-1})(1)统计集合中的所有记录条数> db.user.find().count()(2)查询符合条件的记录数查询 salary 小于 4000 或大于 10000 的记录数> db.user.find({$or: [{salary: {$lt:4000}}, {salary: {$gt:10000}}]}).count()4.3 删除操作4.3.1 删除整个集合中的所有数据> db.wangshibo.find(){ "_id" : ObjectId("5932683b156e298477cdf3ad"), "name" : "菜鸟教程" }> db.wangshibo.remove({})WriteResult({ "nRemoved" : 1 })> db.wangshibo.find()> 可见 wangshibo中的记录全部被删除。mongo在删除数据的时候不支持 all * 全部删除选择{}就可以全部删除了删除mongodb集合中的数据可以使用remove()函数。remove()函数可以接受一个查询文档作为可选参数来有选择性的删除符合条件的文档。remove()函数不会删除集合本身,同时,原有的索引也同样不会被删除。删除文档是永久性的,不能撤销,也不能恢复的。因此,在执行remove()函数前先用find()命令来查看下是否正确,是个比较好的习惯啦。注意 db.collection.remove()和 drop()的区别,remove()只是删除了集合中所有的记录, 而集合中原有的索引等信息还在,而 drop()则把集合相关信息整个删除(包括索引)。4.3.2 删除集合中符合条件的所有记录> db.user.find(){ "_id" : ObjectId("59328c8aa7865327915046ae"), "name" : "GalGadot", "gender" : "female", "age" : 28, "salary" : 11000 }{ "_id" : ObjectId("59328c9da7865327915046af"), "name" : "Mikie Hara", "gender" : "female", "age" : 26, "salary" : 7000 }{ "_id" : ObjectId("59328cd6a7865327915046b0"), "name" : "Wentworth Earl Miller", "gender" : "male", "age" : 41, "salary" : 33000 }> db.user.remove({name:'GalGadot'})WriteResult({ "nRemoved" : 1 })> db.user.find(){ "_id" : ObjectId("59328c9da7865327915046af"), "name" : "Mikie Hara", "gender" : "female", "age" : 26, "salary" : 7000 }{ "_id" : ObjectId("59328cd6a7865327915046b0"), "name" : "Wentworth Earl Miller", "gender" : "male", "age" : 41, "salary" : 33000 }4.3.3 删除集合中符合条件的一条记录> db.user.find(){ "_id" : ObjectId("59328c9da7865327915046af"), "name" : "Mikie Hara", "gender" : "female", "age" : 26, "salary" : 7000 }{ "_id" : ObjectId("59328cd6a7865327915046b0"), "name" : "Wentworth Earl Miller", "gender" : "male", "age" : 41, "salary" : 33000 }> db.user.remove({salary :{$lt:30000}},1)WriteResult({ "nRemoved" : 1 })> db.user.find(){ "_id" : ObjectId("59328cd6a7865327915046b0"), "name" : "Wentworth Earl Miller", "gender" : "male", "age" : 41, "salary" : 33000 }> 当然,也可以是命令:db.user.remove({salary :{$lt:30000}},true),因为true和1是一个意思4.4 更新操作4.4.1 赋值更新db.collection.update(criteria, objNew, upsert, multi )criteria:update 的查询条件,类似 sql update 查询内 where 后面的objNew:update 的对象和一些更新的操作符(如$,$inc...)等,也可以理解为 sql update 查询内 set 后面的。upsert : 如果不存在 update 的记录,是否插入 objNew,true 为插入,默认是 false,不插 入。multi : mongodb 默认是 false,只更新找到的第一条记录,如果这个参数为 true,就把按条 件查出来多条记录全部更新。> db.user.find(){ "_id" : ObjectId("59328cd6a7865327915046b0"), "name" : "Wentworth Earl Miller", "gender" : "male", "age" : 41, "salary" : 33000 }{ "_id" : ObjectId("593293e2a7865327915046b2"), "name" : "GalGadot", "gender" : "female", "age" : 28, "salary" : 11000 }{ "_id" : ObjectId("593293f0a7865327915046b3"), "name" : "Gasdfdst", "gender" : "female", "age" : 58, "salary" : 60000 }{ "_id" : ObjectId("59329401a7865327915046b4"), "name" : "huihui", "gender" : "female", "age" : 18, "salary" : 23100 }> db.user.update({name:'huihui'},{$set:{age:23}},false,true)WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })> db.user.find(){ "_id" : ObjectId("59328cd6a7865327915046b0"), "name" : "Wentworth Earl Miller", "gender" : "male", "age" : 41, "salary" : 33000 }{ "_id" : ObjectId("593293e2a7865327915046b2"), "name" : "GalGadot", "gender" : "female", "age" : 28, "salary" : 11000 }{ "_id" : ObjectId("593293f0a7865327915046b3"), "name" : "Gasdfdst", "gender" : "female", "age" : 58, "salary" : 60000 }{ "_id" : ObjectId("59329401a7865327915046b4"), "name" : "huihui", "gender" : "female", "age" : 23, "salary" : 23100 }> db.user.update({name:'lfqy1'},{$set:{age:23}},true,true)WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : ObjectId("5932946c9758703fe04b0f73")})> db.user.find(){ "_id" : ObjectId("59328cd6a7865327915046b0"), "name" : "Wentworth Earl Miller", "gender" : "male", "age" : 41, "salary" : 33000 }{ "_id" : ObjectId("593293e2a7865327915046b2"), "name" : "GalGadot", "gender" : "female", "age" : 28, "salary" : 11000 }{ "_id" : ObjectId("593293f0a7865327915046b3"), "name" : "Gasdfdst", "gender" : "female", "age" : 58, "salary" : 60000 }{ "_id" : ObjectId("59329401a7865327915046b4"), "name" : "huihui", "gender" : "female", "age" : 23, "salary" : 23100 }{ "_id" : ObjectId("5932946c9758703fe04b0f73"), "name" : "lfqy1", "age" : 23 }4.4.2 增值更新> db.user.find(){ "_id" : ObjectId("52453cfb25e437dfea8fd4f4"), "name" : "Gal Gadot", "gender" : "female", "age" : 28, "salary" : 11000 }{ "_id" : ObjectId("52453d8525e437dfea8fd4f5"), "name" : "Mikie Hara", "gender" : "female", "age" : 26, "salary" : 7000 }{ "_id" : ObjectId("52453e2125e437dfea8fd4f6"), "name" : "Wentworth Earl Miller", "gender" : "male", "age" : 41, "salary" : 33000 }{ "_id" : ObjectId("52454155d8947fb70d000000"), "name" : "not known", "sex_orientation" : "male", "age" : 13, "salary" : 30000 }{ "_id" : ObjectId("5245610881c83a5bf26fc285"), "age" : 23, "name" : "lfqy1" }{ "_id" : ObjectId("52455f8925e437dfea8fd4fd"), "age" : 23, "gender" : "male", "interest" : "NBA", "name" : "lfqy", "salary" : 1 }{ "_id" : ObjectId("5245607525e437dfea8fd4fe"), "age" : 23, "gender" : "male", "interest" : "NBA", "name" : "lfqy", "salary" : 2 }> db.user.update({gender:'female'},{$inc:{salary:50}},false,true)> db.user.find(){ "_id" : ObjectId("52453cfb25e437dfea8fd4f4"), "name" : "Gal Gadot", "gender" : "female", "age" : 28, "salary" : 11050 }{ "_id" : ObjectId("52453d8525e437dfea8fd4f5"), "name" : "Mikie Hara", "gender" : "female", "age" : 26, "salary" : 7050 }{ "_id" : ObjectId("52453e2125e437dfea8fd4f6"), "name" : "Wentworth Earl Miller", "gender" : "male", "age" : 41, "salary" : 33000 }{ "_id" : ObjectId("52454155d8947fb70d000000"), "name" : "not known", "sex_orientation" : "male", "age" : 13, "salary" : 30000 }{ "_id" : ObjectId("5245610881c83a5bf26fc285"), "age" : 23, "name" : "lfqy1" }{ "_id" : ObjectId("52455f8925e437dfea8fd4fd"), "age" : 23, "gender" : "male", "interest" : "NBA", "name" : "lfqy", "salary" : 1 }{ "_id" : ObjectId("5245607525e437dfea8fd4fe"), "age" : 23, "gender" : "male", "interest" : "NBA", "name" : "lfqy", "salary" : 2 }关于更新操作(db.collection.update(criteria, objNew, upsert, multi )),要说明的 是,如果 upsert 为 true,那么在没有找到符合更新条件的情况下,mongo 会在集合中插入 一条记录其值满足更新条件的记录(其中的字段只有更新条件中涉及的字段,字段的值满足 更新条件),然后将其更新(注意,如果更新条件是$lt 这种不等式条件,那么 upsert 插入--------------------------------------------------------------------------------------其它命令操作:1、创建一个聚集集合(table)db.createCollection(“collName”, {size: 20, capped: 5, max: 100});//创建成功会显示{“ok”:1}//判断集合是否为定容量db.collName.isCapped();2、得到指定名称的聚集集合(table)db.getCollection("account");3、得到当前db的所有聚集集合db.getCollectionNames();4、显示当前db所有聚集索引的状态db.printCollectionStats();三、用户相关 1、添加一个用户db.addUser("name");db.addUser("userName", "pwd123", true); 添加用户、设置密码、是否只读2、数据库认证、安全模式db.auth("userName", "123123");3、显示当前所有用户show users;4、删除用户db.removeUser("userName");四、聚集集合查询 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 <= 26db.userInfo.find({age: {$gte: 23, $lte: 26}});9、查询name中包含 mongo的数据db.userInfo.find({name: /mongo/});//相当于%%[code]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 > 25db.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是第几页*pageSize18、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;五、索引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、添加db.users.save({name: ‘zhangsan', age: 25, sex: true});添加的数据的数据列,没有固定,根据添加的数据为准2、修改db.users.update({age: 25}, {$set: {name: 'changeName'}}, false, true);相当于:update users set name = ‘changeName' where age = 25;db.users.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true);相当于:update users set age = age + 50 where name = ‘Lisi';db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true);相当于:update users set age = age + 50, name = ‘hoho' where name = ‘Lisi';3、删除db.users.remove({age: 132});4、查询修改删除db.users.findAndModify({ query: {age: {$gte: 25}}, sort: {age: -1}, update: {$set: {name: 'a2'}, $inc: {age: 2}}, remove: true});db.runCommand({ findandmodify : "users", query: {age: {$gte: 25}}, sort: {age: -1}, update: {$set: {name: 'a2'}, $inc: {age: 2}}, remove: true});update 或 remove 其中一个是必须的参数; 其他参数可选。参数 详解 默认值 query 查询过滤条件 {} sort 如果多个文档符合查询过滤条件,将以该参数指定的排列方式选择出排在首位的对象,该对象将被操作 {} remove 若为true,被选中对象将在返回前被删除 N/Aupdate 一个 修改器对象N/Anew 若为true,将返回修改后的对象而不是原始对象。在删除操作中,该参数被忽略。 falsefields 参见Retrieving a Subset of Fields (1.5.0+) All fields upsert 创建新对象若查询结果为空。 示例 (1.5.4+) false七、语句块操作 1、简单Hello Worldprint("Hello World!");这种写法调用了print函数,和直接写入"Hello World!"的效果是一样的;2、将一个对象转换成jsontojson(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));});八、其他 1、查询之前的错误信息db.getPrevError();2、清除错误记录db.resetError();查看聚集集合基本信息1、查看帮助 db.yourColl.help();2、查询当前集合的数据条数 db.yourColl.count();3、查看数据空间大小 db.userInfo.dataSize();4、得到当前聚集集合所在的db db.userInfo.getDB();5、得到当前聚集的状态 db.userInfo.stats();6、得到聚集集合总大小 db.userInfo.totalSize();7、聚集集合储存空间大小 db.userInfo.storageSize();8、Shard版本信息 db.userInfo.getShardVersion()9、聚集集合重命名 db.userInfo.renameCollection("users"); 将userInfo重命名为users10、删除当前聚集集合 db.userInfo.drop();show dbs:显示数据库列表 show collections:显示当前数据库中的集合(类似关系数据库中的表) show users:显示用户 use <db name>:切换当前数据库,这和MS-SQL里面的意思一样 db.help():显示数据库操作命令,里面有很多的命令 db.foo.help():显示集合操作命令,同样有很多的命令,foo指的是当前数据库下,一个叫foo的集合,并非真正意义上的命令 db.foo.find():对于当前数据库中的foo集合进行数据查找(由于没有条件,会列出所有数据) db.foo.find( { a : 1 } ):对于当前数据库中的foo集合进行查找,条件是数据中有一个属性叫a,且a的值为1

浙公网安备 33010602011771号