mongodb使用命令总结

登陆

./mongo 10.14.101.221:27017 进入开发环境
use admin 切换数据库,如果不存在则创建
db.auth("lightsystem","abc12345") 登陆有密码的用户
show dbs|show databases 显示所有数据库
dbs 当前所在的数据库							
mongos> run("ls","-l","/home/robin") 在mongo中环境下执行linux系统命令
load("xxx.js") 执行js脚本
db.static_human.find({}).skip(290) 跳转到具体行数获取信息
db.getName() 显示当前使用的数据库名称
.pretty() 格式化输出​	
help Mongodb shell 中输入,可以查看最高级别的帮助信息
db.help()	进入数据库后使用db.help()查询数据库级别的帮助信息

数据导入

db.users.insert({user_id:"abc123",age:55,status:"A"}) 向数据库中集合写入数据,如果没有就创建
p={name:"王丹",age:18} 或者采用赋值的方式写入数据
db.person.insert(p)
db.person.save(p) insert和save功能一样
for(var i=1;i<5;i++) db.person.insert{{"name":"王丹","age":i}} mongodb内部支持js,可以使用js命令
for(i=2;i<=20;i++){
... db.user.insert({"uid":i,"name":"luotianshuai"+i,"salary":2000+Math.round(Math.random())*5000})
... }

删除

db.user.remove({"name":"zhangshan"}) 删除匹配字段
db.collection1.remove({age:7,name:"xiaomu"}) 删除age为7,name为xiaomu的数据
db.user.remove({}) 删除所有数据
db.user.drop() 删除集合
db.dropDatabase() 进入具体数据库中执行,可删除档期数据库

索引相关

db.col.getIndexes() 查看集合索引
db.col.totalIndexSize() 查看集合索引大小
db.col.dropIndexes() 删除集合所有索引
db.col.dropIndex("索引名称") 删除集合指定索引
db.c3.ensureIndex({age:1}) 为age字段建普通索引
db.c3.dropIndex({age:1}) 删除age字段的索引
db.c3.ensureIndex({age:1},{unique:true}) 为age字段建唯一索引,在为字段建了唯一索引后就不能再添加相同值的记录了
db.values.createIndex({open: 1, close: 1}, {background: true}) 在后台中创建索引
db.col.createIndex({"title":1,"description":-1})  创建复合索引

数据库查询相关功能

db.aaa.find().limit(2).skip(0).sort({device_type:-1}) 1:表示升序排序,-1:表示降序排序
db.aaa.find({version:1}) 仅获取version为1的信息条
db.news.find( {}, { id: 1, title: 1 } ) 只输出id和title字段,第一参数为查询条件,空代表查询所有
db.news.find( {}, {content: 0 } ) 除过content字段,输出其余字段
db.inventory.find( { type: 'food' } ) 返回type字段为food的信息段
db.inventory.find( { type: 'food' }, { item: 1, qty: 1, _id:0 } ) 指定某些字段,排除某些字段
db.collection1.findOne() 查询集合的第一条数据
db.users.count() 当前数据库中数据条数	
db.aaa.find({plate_no:{$regex:'京A'}}) 模糊匹配

集合相关

db.createCollection("collectionName") 创建集合
show collections|show tables 查看当前数据库中的集合
db.collection1.count() 统计集合collection1中的数据数量
db.createCollection("collectionName",{capped:true,size:10000,max:100}) size指定集合大小,单位为KB,max指定文档数量

数据备份与恢复

备份:mongodump -h dbhost -d dbname -o dbdirectory
-h:mongodb所在服务器地址,如127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d:需要备份的数据库实例,如:test
-o:需要备份的数据存放的位置,例如:d:\data (如果没有则自动创建)
恢复:mongorestore -h dbhost -d dbname -directoryperdb dbdirectory
-h:mongodb所在服务器地址,如127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d:需要备份的数据库实例,如:test,此名称也可以和备份的时候不一样
-directoryperdb :备份数据所在的位置,例如:d:\data
注意:恢复时要在退出mongo命令行状态下执行

导入与导出

导出:mongoexport -h dbhost -d dbname -c collectionName -o output
-h:数据库地址
-d:指明使用的库
-c:指明要导出的集合
-o:指明要导出的文件路径加文件名,文件名可以是txt、word、excel等多种文件格式
导入:mongoimport -h dbhost -d dbname -c collectionname 文件的地址路径
-h:数据库地址
-d:指明使用的库
-c:指明要导出的集合
注意:导入时要在退出mongo命令行状态下执行,导入导出与数据备份和恢复相似

数据更新

1、笨办法
更新文档这里通过update方法括号内,第一个文档为查询的文档,第二个文档为修改为什么文档!
> db.user.update({"uid":2},{"name":"shuaige"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
通过查看这种更新方式,后面的文档会覆盖我们要修改文档的整个内容,就变成下面的内容了。uid字段salary字段都被覆盖掉了
> db.user.find()
{ "_id" : ObjectId("575f068e0c73a5a96e8f7ca3"), "name" : "shuaige" }
所以用下面的方法可以
>  db.user.update({"uid":3},{"uid" : 3, "name" : "shuaige", "salary" : 2000 })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.findOne({"uid":3})
{
        "_id" : ObjectId("575f068e0c73a5a96e8f7ca4"),
        "uid" : 3,
        "name" : "shuaige",
        "salary" : 2000
}
>
可以看到这个更新结果是我们想要的结果,这种方式叫做文档的替换方式更新!
但是我们uid不需要变更,salary也不需要变更但是我们都要写出来


2、变量替换方式
我们可以把取出来的值赋值给一个变量,然后通过变量去修改!
#把查询到的值赋值给a
> a = db.user.findOne({"uid":4})
{
        "_id" : ObjectId("575f068e0c73a5a96e8f7ca5"),
        "uid" : 4,
        "name" : "luotianshuai4",
        "salary" : 7000
}
> a.name
luotianshuai4
#通过变量.字段名去修改字段的内容
> a.name="dashuaige"
dashuaige
> db.user.findOne({"uid":4})
{
        "_id" : ObjectId("575f068e0c73a5a96e8f7ca5"),
        "uid" : 4,
        "name" : "luotianshuai4",
        "salary" : 7000
}
#然后在通过update更新
> db.user.update({"uid":4},a)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.findOne({"uid":4})
{
        "_id" : ObjectId("575f068e0c73a5a96e8f7ca5"),
        "uid" : 4,
        "name" : "dashuaige",
        "salary" : 7000
}
他的本质还是替换的方式,只不过是方便了

3、使用修改器$inc更新
如何对uid为10的用户增加100块钱工资
#这里$inc遵循键值对的规则,他相当于键,要修改内容为值
> db.user.update({"uid":10},{"$inc":{"salary":100}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
#结果
{ "_id" : ObjectId("575f068e0c73a5a96e8f7cab"), "uid" : 10, "name" : "luotianshuai10", "salary" : 7100 }
#减100
> db.user.update({"uid":10},{"$inc":{"salary":-100}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
#结果
{ "_id" : ObjectId("575f068e0c73a5a96e8f7cab"), "uid" : 10, "name" : "luotianshuai10", "salary" : 7000 }

4、添加一个字段$set修改器
有时候有需求要给某个文档添加一个字段,比如年龄。使用$set
#添加器$set
> db.user.update({"uid":10},{"$set":{"age":18}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
#结果
{ "_id" : ObjectId("575f068e0c73a5a96e8f7cab"), "uid" : 10, "name" : "luotianshuai10", "salary" : 7000, "age" : 18 }

5、删除一个字段$unset修改器
有时候有需求要求给某个文档删除一个字段,比如年龄。使用$unset
#这里注意使用unset的时候他的值也是一个字典要删除的字段:1 这个1,是true的意思删除它,所以这个1是逻辑的true
> db.user.update({"uid":10},{"$unset":{"age":1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
#结果
{ "_id" : ObjectId("575f068e0c73a5a96e8f7cab"), "uid" : 10, "name" : "luotianshuai10", "salary" : 7000 }
看上面使用$unset的时候age的值为1说明为true那我们也可以通过值为true来删除它,那么我们来删除uid为10的salary字段
#例子
> db.user.update({"uid":10},{"$unset":{"salary":true}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
结果:
{ "_id" : ObjectId("575f068e0c73a5a96e8f7cab"), "uid" : 10, "name" : "luotianshuai10" }

6、更新文档的其他参数
> db.user.update({arg1},{arg2},arg3,arg4)
'''
参数1:条件     #通过他来查找
参数2:需要操作的更新内容      #把找到的文档修改
参数3:
参宿4:
'''
#参数3是做什么呢?
咱们看下下面一种情况:
如果我现在想更新一条数据uid为100,我这里是没有这个uid为100的文档的
> db.user.find({"uid":100}) #为空
那么现在我修改他下那么会成功的修改吗?
> db.user.update({"uid":100},{"uid":100,"name":"luotianshuai100","salary":100})
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
#看上面的提示找到0,修改0,说明没有更新,那么第3个参数的作用就来了,给他设置为true
> db.user.update({"uid":100},{"uid":100,"name":"luotianshuai100","salary":100},true)
WriteResult({
        "nMatched" : 0,
        "nUpserted" : 1, #当查找不到的时候,我们插入它
        "nModified" : 0,
        "_id" : ObjectId("575f12ee7732f402fffdf61b")
})
> 
#查看下,他更新成功了
{ "_id" : ObjectId("575f12ee7732f402fffdf61b"), "uid" : 100, "name" : "luotianshuai100", "salary" : 100 }

'''
so  那么第三个参数的含义就展现出来了,如果查找不到条件,那么就插入我们修改内容
'''
#参数4的含义
现在有个需求我现在需要给所有的员工加10000块钱,来看下我的操作
> db.user.update({},{"$inc":{"salary":1000}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

#可以看到他只更新了匹配到的第一条数据那么,第4个参数的作用就来了
> db.user.update({},{"$inc":{"salary":1000}},false,true)
WriteResult({ "nMatched" : 20, "nUpserted" : 0, "nModified" : 20 })
> 
'''
从上面可以看出,第四个参数的作用就是设置为true的时候就是匹配所有文档
'''

更新文档中的文档和更新文档中的数组

先创建一个文档,然后通过修改他来实际看下如何修改文档中的文档和文档中的数组

> db.user.insert({"uid":1,"name":"luotianshuai","content":{"addr":"beijing","code":10085,"qq":"1234567"},"email":[]})
WriteResult({ "nInserted" : 1 })
> db.user.findOne()
{
        "_id" : ObjectId("575f19c45e4f17980e7b3366"),
        "uid" : 1,
        "name" : "luotianshuai",
        "content" : {
                "addr" : "beijing",
                "code" : 10085,
                "qq" : "1234567"
        },
        "email" : [ ]
}
> 

一、数组的更新
1、数组增加元素$push

> db.user.update({"uid":1},{"$push":{"email":"a"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.findOne()
{
        "_id" : ObjectId("575f19c45e4f17980e7b3366"),
        "uid" : 1,
        "name" : "luotianshuai",
        "content" : {
                "addr" : "beijing",
                "code" : 10085,
                "qq" : "1234567"
        },
        "email" : [
                "a"
        ]
}
> 

$push 是在元组增加一个元素,会在数组的最后追加元素
2、$pushAll 在元组增加多个元素,但是他不检查元素是否存在
如下:b已经存在了,我再同时增加b,c,d看下是什么结果

> db.user.update({"uid":1},{"$push":{"email":"b"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.findOne()
{
        "_id" : ObjectId("575f1b9a5e4f17980e7b3367"),
        "uid" : 1,
        "name" : "luotianshuai",
        "content" : {
                "addr" : "beijing",
                "code" : 10085,
                "qq" : "1234567"
        },
        "email" : [
                "a",
                "b"
        ]
}
> 

$pushAll

> db.user.update({"uid":1},{"$pushAll":{"email":["b","c","d"]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.findOne()
{
        "_id" : ObjectId("575f1b9a5e4f17980e7b3367"),
        "uid" : 1,
        "name" : "luotianshuai",
        "content" : {
                "addr" : "beijing",
                "code" : 10085,
                "qq" : "1234567"
        },
        "email" : [
                "a",
                "b",
                "b",
                "c",
                "d"
        ]
}
> 

3、$addToSet 往数组中添加一个不重复的元素
> db.user.update({"uid":1},{"$addToSet":{"email":"d"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
> 
#从上面的结果可以看出匹配到了一个,插入和修改了0个,说明他可以判断元素是否存在
添加一个元素
#如果不存在就创建
> db.user.update({"uid":1},{"$addToSet":{"email":"e"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> 
添加多个不重复的元素,这时候就得需要用到$eache操作符了

#这里e,d都是存在的然后g,f是不存在的批量插入看下结果
> db.user.update({"uid":1},{"$addToSet":{"email":{"$each":["e","g","f","d"]}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

#结果
> db.user.findOne()
{
        "_id" : ObjectId("575f1b9a5e4f17980e7b3367"),
        "uid" : 1,
        "name" : "luotianshuai",
        "content" : {
                "addr" : "beijing",
                "code" : 10085,
                "qq" : "1234567"
        },
        "email" : [
                "a",
                "b",
                "b",
                "c",
                "d",
                "e",
                "g",
                "f"
        ]
}
> 

总结:
db.user.update({"uid":1},{"$push":{"email":"a"}})  #在数组末尾添加一个元素
db.user.update({"uid":1},{"$pushAll":{"email":["b","c","d"]}}) #在数组末尾添加多个元素,且并不检查是否重复
db.user.update({"uid":1},{"$addToSet":{"email":"d"}}) #向数组添加一个不重复的元素
#在实际的生产中可能需要插入多个不重复的元素可以使用$addToSet 结合$eache操作符
db.user.update({"uid":1},{"$addToSet":{"email":{"$each":["e","g","f","d"]}}})
    
    
二、删除数组元素
db.user.update({"uid":1},{"$pop":{"email":-1}}) #从左侧删除一个元素
db.user.update({"uid":1},{"$pop":{"email":1}})#从右侧删除一个元素
db.user.update({"uid":1},{"$pull":{"email":"b"}}) #删除数组内的指定一个元素
db.user.update({"uid":1},{"$pullAll":{"email":["b","c"]}}) #删除数组内指定的多个元素

三、数组元素的更新
1、通过变量调用下标修改

> db.user.findOne()
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),
        "uid" : 1,
        "name" : "luotianshuai",
        "content" : {
                "addr" : "beijing",
                "code" : 10085,
                "qq" : "1234567"
        },
        "email" : [
                "d",
                "e"
        ]
}
> a = db.user.findOne()
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),
        "uid" : 1,
        "name" : "luotianshuai",
        "content" : {
                "addr" : "beijing",
                "code" : 10085,
                "qq" : "1234567"
        },
        "email" : [
                "d",
                "e"
        ]
}
> a.email
[ "d", "e" ]
> a.email[0]
d
> a.email[1]
e
> a.email[1] = "shuaige.qq.com"
shuaige.qq.com
> db.user.update({"uid":1},a)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.findOne()
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),
        "uid" : 1,
        "name" : "luotianshuai",
        "content" : {
                "addr" : "beijing",
                "code" : 10085,
                "qq" : "1234567"
        },
        "email" : [
                "d",
                "shuaige.qq.com"
        ]
}
> 

2、通过数组.下标修改

> db.user.findOne()
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),
        "uid" : 1,
        "name" : "luotianshuai",
        "content" : {
                "addr" : "beijing",
                "code" : 10085,
                "qq" : "1234567"
        },
        "email" : [
                "d",
                "shuaige.qq.com"
        ]
}
> db.user.update({"uid":1},{"$set":{"email.0":"tim.qq.com"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.findOne()
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),
        "uid" : 1,
        "name" : "luotianshuai",
        "content" : {
                "addr" : "beijing",
                "code" : 10085,
                "qq" : "1234567"
        },
        "email" : [
                "tim.qq.com",
                "shuaige.qq.com"
        ]
}
> 
上面的emil.0 相当于emil[0]  通过下标调用mongodb能识别它!

四、文档的文档修改
看下面的例子说明,文档的文档可以通过“.”分法一级一级的嵌套下去修改他如下
1、查询

> b = db.user.findOne()
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),
        "uid" : 1,
        "name" : "luotianshuai",
        "content" : {
                "addr" : "beijing",
                "code" : 10085,
                "qq" : "1234567"
        },
        "email" : [
                "tim.qq.com",
                "shuaige.qq.com"
        ]
}
> b.con
b.constructor  b.content
> b.content
{ "addr" : "beijing", "code" : 10085, "qq" : "1234567" }
> b.content.addr
beijing
> b.content.addr 

2、修改

> b.content.code = 123456789
123456789
> b
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),
        "uid" : 1,
        "name" : "luotianshuai",
        "content" : {
                "addr" : "beijing",
                "code" : 123456789,
                "qq" : "1234567"
        },
        "email" : [
                "tim.qq.com",
                "shuaige.qq.com"
        ]
}
> db.user.update({"uid":1},b)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.findOne()
{
        "_id" : ObjectId("575f21df5e4f17980e7b3369"),
        "uid" : 1,
        "name" : "luotianshuai",
        "content" : {
                "addr" : "beijing",
                "code" : 123456789,
                "qq" : "1234567"
        },
        "email" : [
                "tim.qq.com",
                "shuaige.qq.com"
        ]
}
> 

学无止境966 发布了177 篇原创文章 · 获赞 6 · 访问量 7533 私信 关注

相关文章

MongoTemplate 是Spring Data MongoDB 中的一个核心类,为 S...
笔者今天要分享的是一个项目重构过程中如何将数据库选型由原...
mongodb/mongoTemplate.upsert批量插入更新数据的实现
进入官网下载官网安装点击next勾选同意,点击next点击custom...
头歌 MongoDB实验——数据库基本操作
期末考试复习总结