MongoDB
一安装MongoDB和账号管理
1、安装路径为
D:\MongoDB,将D:\MongoDB\bin目录加入环境变量
2、新建目录与文件
D:\MongoDB\data\db
D:\MongoDB\log\mongod.log
3、制作系统服务
mongod --bind_ip 0.0.0.0 --port 27017 --logpath D:\MongoDB\log\mongod.log --logappend --dbpath D:\MongoDB\data\db --serviceName "MongoDB" --serviceDisplayName "MongoDB" --install
4、启动系统服务/关闭系统服务
net start MongoDB / net stop MongoDB
5、进入MongoDB
当进入MongoDB有一些警告信息,需要去掉
首先关闭服务,再进行重启数据库
mongod --remove mongod --bind_ip 0.0.0.0 --port 27017 --logpath D:\MongoDB\log\mongod.log --logappend --dbpath D:\MongoDB\data\db --serviceName "MongoDB" --serviceDisplayName "MongoDB" --install --auth
在MongoDB外登录账号
mongo --port 27017 -u "root" -p "123" --authenticationDatabase "admin"
6、创建账号,MongoDB每个数据库都是唯一账号密码,所以先进入其内再进行创建
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
use admin db.createUser( { user: "root", pwd: "123", roles: [ { role: "root", db: "admin" } ] # 创建权限 } ) #创建一个普通账号 use test db.createUser( { user: "egon", pwd: "123", roles: [ { role: "readWrite", db: "test" }, #操作test库有读写权限 { role: "read", db: "db1" } ] #操作其他库只有读的权限 } )
二、操作
1、数据库操作
#1、增 use config #如果数据库不存在,则创建数据库,否则切换到指定数据库。 #2、查 show dbs #查看所有 可以看到,我们刚创建的数据库config并不在数据库的列表中, 要显示它,我们需要向config数据库插入一些数据。 db.user.insert({'a':1}) #3、删 use config #先切换到要删的库下 db.dropDatabase() #删除当前库
2、集合操作:
#1、增 #mongoDB 中得表没有父子的关系 db.user db.user.info db.user.auth # 创建一个id是1,名字是egon的数据,id必须写_id db.user.insert({"_id":1,"name":""egon"})
#2、查 > show dbs #只要不为空就能显示出来 > show tables > show collextions #与tables一样功能 table1 table2
#3、删 > db.table1.drop() true > show tables table2
3、文档操作
添加数据进入表
db.user.insert({"_id":1,"name":"egon"})
《a、增加》
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#1、没有指定_id则默认ObjectId,_id不能重复,且在插入后不可变 #2、插入单条 user0={ "name":"egon", "age":10, 'hobbies':['music','read','dancing'], 'addr':{ 'country':'China', 'city':'BJ' } } #把user0的数据添加进去 db.user.insert(user0) #查看表里的所有数据 db.user.find() #3、插入多条 user1={ "_id":1, "name":"alex", "age":10, 'hobbies':['music','read','dancing'], 'addr':{ 'country':'China', 'city':'weifang' } } user2={ "_id":2, "name":"wupeiqi", "age":20, 'hobbies':['music','read','run'], 'addr':{ 'country':'China', 'city':'hebei' } } user3={ "_id":3, "name":"yuanhao", "age":30, 'hobbies':['music','drink'], 'addr':{ 'country':'China', 'city':'heibei' } } user4={ "_id":4, "name":"jingliyang", "age":40, 'hobbies':['music','read','dancing','tea'], 'addr':{ 'country':'China', 'city':'BJ' } } user5={ "_id":5, "name":"jinxin", "age":50, 'hobbies':['music','read',], 'addr':{ 'country':'China', 'city':'henan' } } #添加多条数据进去 db.user.insertMany([user1,user2,user3,user4,user5])
# 基于save添加
db.t1.insert({"_id":1,"a":1,"b":2,"c":3}) #有相同的_id则覆盖,无相同的_id则新增,必须指定_id db.t1.save({"_id":1,"z":6}) db.t1.save({"_id":2,"z":6}) db.t1.save({"z":6})
《b、查询》
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#SQL与MongoDB查询分别: # SQL:=,!=,>,<,>=,<= # MongoDB:{key:value}代表什么等于什么,"$ne","$gt","$lt","gte","lte",其中"$ne"能用于所有数据类型 #1、名字等于alex SQL:select * from db1.user where name = "alex"; MongoDB:db.user.find({'name':'alex'}) #2、名字不等于alex SQL:select * from db1.user where name != "alex"; MongoDB:db.user.find({'name':{"$ne":'alex'}}) #3、id大于2 SQL:select * from db1.user where id > 2; MongoDB:db.user.find({'_id':{'$gt':2}}) #4、id小于3 SQL:select * from db1.user where id < 3; MongoDB:db.user.find({'_id':{'$lt':3}}) #5、id大于等于2 SQL:select * from db1.user where id >= 2; MongoDB:db.user.find({"_id":{"$gte":2,}}) #6、id小于等于2 SQL:select * from db1.user where id <= 2; MongoDB:db.user.find({"_id":{"$lte":2}})
SQL语句中:and、or、not
MongoDB中:筛选只能是字典套条件{{},[]} 逗号“,”是和的意思,
或者:“$or”后面条件放入[]中,“$or”:[] 否则:用“$not”表示
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# SQL:and,or,not # MongoDB:字典中逗号分隔的多个条件是and关系,"$or"的条件放到[]内,"$not" #1、取出id大于等于2和小于4的数据 SQL:select * from db1.user where id >= 2 and id < 4; MongoDB:db.user.find({'_id':{"$gte":2,"$lt":4}}) #2、取出id大于等于2和年龄小于40的数据 SQL:select * from db1.user where id >= 2 and age < 40; MongoDB:db.user.find({"_id":{"$gte":2},"age":{"$lt":40}}) #3、取出id大于等于5或者name等于alex的数据 SQL:select * from db1.user where id >= 5 or name = "alex"; MongoDB:db.user.find({ "$or":[ {'_id':{"$gte":5}}, {"name":"alex"} ] }) #取出id(大于等于0和小于等于1)或id大于等于4或name等于yuanhao的数据 SQL:select * from db1.user where id >=0 and id <=1 or id >=4 or name = "yuanhao"; MongoDB:db.user.find({"$or":[ {"_id":{"$lte":1,"$gte":0}}, {"_id":{"$gte":4}}, {"name":"yuanhao"} ]}) #4、取出除以2于1的id SQL:select * from db1.user where id % 2=1; MongoDB:db.user.find({'_id':{"$mod":[2,1]}}) #5、上题,取反 db.user.find({'_id':{"$not":{"$mod":[2,1]}}}) 逻辑运算
成员运算:$in,$nin
#查询name中alex和egon是否在数据中 db.user.find({"name":{"$in":["alex","egon"]}}) db.user.find({"name":{"$nin":["alex","egon"]}})
正则匹配
#查询以jin开头和以g或n结尾的数据,i是区分大小写的 select * from db1.user where name regexp "^jin.*?(g|n)$"; db.user.find({ "name":/^jin.*?(g|n)$/i })
查指定字段
#0是不显示其字段,1就是显示其字段 select name,age from db1.user where name regexp "^jin.*?(g|n)$"; db.user.find({ "name":/^jin.*?(g|n)$/i }, { "_id":0, "name":1, "age":1 } )
查询数组
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#1、查看有dancing爱好的人 db.user.find({'hobbies':'dancing'}) #2、查看既有dancing爱好又有tea爱好的人 db.user.find({'hobbies':{"$all":['dancing','tea']}}) #3、查看第2个爱好dancing的人 db.user.find({"hobbies.2":"dancing"}) #4、查看数据中以索引[1,2]切片显示爱好,并且只显示爱好字段 db.user.find( {}, { "_id":0, "name":0, "age":0, "addr":0, "hobbies":{"$slice":[1,2]}, } )
排序
# 排序:--1代表升序,-1代表降序 db.user.find().sort({"name":1,}) db.user.find().sort({"age":-1,'_id':1})
获取数量
# 获取数量 db.user.count({'age':{"$gt":30}}) --或者 db.user.find({'age':{"$gt":30}}).count()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#1、{'key':null} 匹配key的值为null或者没有这个key db.t2.insert({'a':10,'b':111}) db.t2.insert({'a':20}) db.t2.insert({'b':null}) > db.t2.find({"b":null}) { "_id" : ObjectId("5a5cc2a7c1b4645aad959e5a"), "a" : 20 } { "_id" : ObjectId("5a5cc2a8c1b4645aad959e5b"), "b" : null } #2、查找所有 db.user.find() #等同于db.user.find({}) #格式变好看 db.user.find().pretty() #3、查找一个,与find用法一致,只是只取匹配成功的第一个 db.user.findOne({"_id":{"$gt":3}})
《c、修改》
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#update() 方法用于更新已存在的文档。语法格式如下: db.user.update( 条件, 修改字段, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } ) 参考SQL:update db1.t1 set id=10 where name="egon"; upsert : 可选,默认为false,代表如果不存在update的记录不更新也不插入,设置为true代表插入。 multi : 可选,默认为false,代表只更新找到的第一条记录,设为true,代表更新找到的全部记录。 writeConcern :可选,抛出异常的级别。 更新操作是不可分割的:若两个更新同时发送,先到达服务器的先执行,然后执行另外一个,不会破坏文档。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#查找name等于egon,把age修改为11,如果没有upsert为true就会添加一条只有age=11的数据 db.user.update( {"name":"egon"}, {"age":11}, { "multi":true, "upsert":true } )
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#覆盖式:就是按照条件查找数据,修改的数据把原来的数据覆盖掉(慎用) db.user.update( {"name":"alex"}, {"age":10,"name":"Alex**"} )
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#局部修改:$set 只修改更新字段(很受用)如果没有age字段,同样会自动添加 db.user.update( {"name":"alex"}, {"$set":{"age":73,"name":"潘金莲-alex"}} )
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#改多条 就是把查询知识运用进来,请看查询 db.user.update( {"_id":{"$gte":1,"$lte":2}}, {"$set":{"age":53,}}, {"multi":true} )
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#修改嵌套文档 大概意思就是字典中如果还有字典,就可以用“.”进行内部修改(不懂自己实验) #{ "_id" : 3, "name" : "潘金莲-alex", "age" : 30, "hobbies" : [ "music", "drink" ], "addr" : { "country" : "China", "city" : "heibei" } } db.user.update( {"name":"潘金莲-alex"}, {"$set":{"addr.country":"Japan"}}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#修改数组 也就是按照索引修改(MMP脑袋炸了,一看到数字就蒙蔽) db.user.update( {"name":"潘金莲-alex"}, {"$set":{"hobbies.1":"Piao"}} )
《d、删除》
#1、删除多个中的第一个 db.user.deleteOne({ 'age': 8 }) #2、删除国家为China的全部 db.user.deleteMany( {'addr.country': 'China'} ) #3、删除全部 db.user.deleteMany({})
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#1、unset 删除某字段所有记录 db.user.update( {"name":"潘金莲-alex"}, {"$unset":{"hobbies":""}} ) #2、$inc 增加和减少,加减法懂就能明白其道理 db.user.update( {}, {"$inc":{"age":1}}, {"multi":true} ) db.user.update( {}, {"$inc":{"age":-10}}, {"multi":true} ) #3、$push, $pop $pull 一个添加,两个删除 #按照字段添加其数据(简单) db.user.update( {"name":"yuanhao"}, {"$push":{"hobbies":"tangtou"}}, {"multi":true} ) #$each就是把列表循环加如字段内 db.user.update( {"name":"yuanhao"}, {"$push":{"hobbies":{"$each":["纹身","抽烟"]}}}, {"multi":true} ) #从头删-1,从尾删1 db.user.update( {"name":"yuanhao"}, {"$pop":{"hobbies":-1}}, {"multi":true} ) db.user.update( {"name":"yuanhao"}, {"$pop":{"hobbies":1}}, {"multi":true} ) #按条件删 db.user.update( {"name":"yuanhao"}, {"$pull":{"hobbies":"纹身"}}, {"multi":true} )
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#避免添加重复:"$addToSet" ,了解了解 db.urls.insert({"_id":1,"urls":[]}) db.urls.update({"_id":1},{"$addToSet":{"urls":'http://www.baidu.com'}}) db.urls.update({"_id":1},{"$addToSet":{"urls":'http://www.baidu.com'}}) db.urls.update({"_id":1},{"$addToSet":{"urls":'http://www.baidu.com'}}) db.urls.update({"_id":1},{ "$addToSet":{ "urls":{ "$each":[ 'http://www.baidu.com', 'http://www.baidu.com', 'http://www.xxxx.com' ] } } } )