MongoDB
Posted 丶默箫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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每个数据库都是唯一账号密码,所以先进入其内再进行创建
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、增加》
#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、查询》
#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”表示
# 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 } )
查询数组
#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()
#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、修改》
#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 :可选,抛出异常的级别。 更新操作是不可分割的:若两个更新同时发送,先到达服务器的先执行,然后执行另外一个,不会破坏文档。
#查找name等于egon,把age修改为11,如果没有upsert为true就会添加一条只有age=11的数据 db.user.update( {"name":"egon"}, {"age":11}, { "multi":true, "upsert":true } )
#覆盖式:就是按照条件查找数据,修改的数据把原来的数据覆盖掉(慎用) db.user.update( {"name":"alex"}, {"age":10,"name":"Alex**"} )
#局部修改:$set 只修改更新字段(很受用)如果没有age字段,同样会自动添加 db.user.update( {"name":"alex"}, {"$set":{"age":73,"name":"潘金莲-alex"}} )
#改多条 就是把查询知识运用进来,请看查询 db.user.update( {"_id":{"$gte":1,"$lte":2}}, {"$set":{"age":53,}}, {"multi":true} )
#修改嵌套文档 大概意思就是字典中如果还有字典,就可以用“.”进行内部修改(不懂自己实验) #{ "_id" : 3, "name" : "潘金莲-alex", "age" : 30, "hobbies" : [ "music", "drink" ], "addr" : { "country" : "China", "city" : "heibei" } } db.user.update( {"name":"潘金莲-alex"}, {"$set":{"addr.country":"Japan"}}
#修改数组 也就是按照索引修改(MMP脑袋炸了,一看到数字就蒙蔽) db.user.update( {"name":"潘金莲-alexios - Heroku 和 MongoDb 上的自定义解析服务器错误 3080:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项在 Spring MongoDB 的 ReplaceRoot 管道阶段使用 $mergeObjects