MongoDB快速上手

2019-01-08  本文已影响15人  underShadow

本章我将带你一步一步上手MongoDB,你将学习到:

  1. MongoDB 基本配置过程
  2. MongoDB 最常用的查询语言
  3. javascript 脚本化查询
  4. 从删库到跑路之导出数据库

前瞻:

  1. 首先是环境变量


    1548401200643.png

配置完成后在CMD测试一下

TIM截图20190125152709.jpg
  1. 紧接C盘下创建Data,Log目录和.log文件
TIM截图20190125153244.jpg

到安装软件根目录新建一个配置文件

TIM截图20190125153737.jpg

打开你的编辑器Vscode(我用的是) 添加这样两行配置信息

TIM截图20190125153755.jpg

在系统服务中开启这样的服务就大功告成了!!

TIM截图20190125155139.jpg 1548414914350.png

1. 导入数据库

  1. mongoimport 导入数据库 此时collection的名字就是你的.json的文件名
1528257212135.png
  1. 如果你写的for循环是可以先创建数据库,然后使用load("这里写路径记得是斜杠") 来写入数据的
mongo  #进入SHELL
use newDatabase  # 创建新数据库
load("E:/WorkPlace/mongoExam/repo.js")

2. 导出带筛选条件的数据库

mongoexport -d shiyanlou -c employee -q "{'age':{$gte:30}}" -f sid,sname.age,gender,phone,address --out ./tmp/employee.json

-d 指名使用的库

-c 知名要导出的表

-o / --out 导出位置,文件名

-csv 知名导出的文件是CSV

-q 过滤导出,注意这里需要双引号

-f 显示输出

3. 查询

1. 脚本查询

var persons = db.persons.find({name:"jim"})
while(persons.hasNext()){
    obj = persons.next();
       print(obj.books.length)
}
1528266398042.png

2. find 查询

db.[你的数据库名字].find({要查询的东西}).pretty()
#比方说 我现在有一个叫persons 的 collection
db.persons.find().pretty() #这样就显示了所有的数据
# 不显示信息哪些信息在第二个大括号内db.persons.find({},{这里是筛选显示信息}) 考试中如果没说显示_id那么默认_id:0
#假设有内嵌文档如下:
{ "name" : { "first" : Barack", "last" : "Obama" }}
#精确查询内嵌文档(此时只有完全匹配才会显示信息)
db.persons.find({ name:{first:"Barack",last:"Obama" }}) 
#键/值对查询,通过点表示法来精确表示内嵌文档的键
db.persons.find({"name.first":"Barack","name.last":"Obama"})

db.persons.find({},{_id:0}) 不显示id信息

db.persons.find({age: {$gte:25,$lte:27},{_id:0,age:1}) 年龄在25到27岁之间的学生

db.persons.find({country:{$ne:"China"}},{_id:0}) 国家不是中国的学生

db.persons.find({country:{$in:["USA","China"]}}) $in 包含

db.persons.find({country:{$nin:["USA","China"]}}) $nin 不包含

db.persons.find({$or:[{c:{$gte:85}},{e:{$gte:90}}]},{_id:0}) 语文大于等于58或者英语大于等于90

start = new Date("1997/1/1") #查询在1997年1月1日之后出生的人
db.getCollection('student').find({"sbirthday":{$gt:"start"}})

$inc:{} 增加指定的键值对,支持 正负 设置

数组为追加$push

数组尾删除 $pop value : 1

头删除 $pop value :-1

正则表达式db.persons.find({name:/li/i},{_id:0,name:1}) 找名字里有 li ..

逻辑运算

#查询25岁的女同学的信息;
db.getCollection('student').find({$and:[{sage:{$gt:25}},{sex:"女"}]})
#查询不是姓王的同学的信息;
db.getCollection('student').find({sname:{$not:/王/i}})
#查询数据库成绩是优秀或者操作系统成绩是良好的学生信息;
db.getCollection('student').find({$or:[{DB:{$gte:90}},{os:{$gte:80,$lt:90}}]})
#查询选修MongoDB或选修Python的学生信息
db.getCollection('student').find({books:{$in:["MongoDB","Python"]}})
#查询年龄与20求模余1的学生信息。
db.getCollection('student').find({sage:{$mod:[20,1]}})

注意这里区分中括号与大括号的原则:如果运算中需要将多个字符当作整体运算就会用到中括号, OR运算,指定一个至少包含两个表达式的数组

数组查找

db.persons.find({books:{$all:["MONGOBD","JS"]}},{books:1,_id:0}) 找喜欢看MONGODB和JS的同学

db.persons.find({"books.1":"JAVA"}) 找第一本书是JAVA的同学

db.persons.find({books:{$size:4}},{_id:0,books:1}) 找拥有四本书的学生

#查询出jim书架中的第2~4本书
db.getCollection('persons').find({name:"jim"},{books:{$slice:[1,3]}})
#查询出jim的最后一本书
db.getCollection('persons').find({name:"jim"},{books:{$slice:-1}})
#查询出jim的最后两本书
db.getCollection('persons').find({name:"jim"},{books:{$slice:-2}})
#查询出jim的前两本书
db.getCollection('persons').find({name:"jim"},{books:{$slice:2}})

find结合count,limit,skip

#不带条件的统计,与find结合使用:
#统计年龄大于21岁学生数量;
db.getCollection('student').find({sage:{$gt:21}}).count()
#统计女同学学生数量;
db.getCollection('student').find({sex:"女"}).count()
#统计拥有5本书学生数量。
db.getCollection('student').find({books:{$size:5}}).count()
#带条件的统计,直接在count()中添加条件。
#统计大于21岁男同学的学生数量;
db.getCollection('student').count({sage:{$gt:21}},{sex:"男"})
--------------------------------------------------- skip limit
#查询跳过前3条数据,从第4条记录开始的5的条记录
db.student.find().skip(3).limit(5)
#查询#第1~10条数据;
db.student.find().limit(10)
#查询第11~20条数据;
db.student.find().skip(10).limit(10)
--------------------------------------------------- sort
#查询按照年龄降序排序学生的信息 降:-1 生:1  
db.student.find({}).sort({sage:-1})
#查询按照年龄降序排序并且姓名按照升序排序
db.student.find({}).sort({sage:-1},{sname:1})
#查询最大年龄的5名学生的信息。
db.student.find({}).sort({sage:-1}).limit(5)

3. update 更新

db.person.update({country:"China"},{$set:{sex:"male"}},false,true)

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,就把按条件查出来多条记录全部更新。

#将所有年龄为21岁的学生年龄一律减少2岁;true
db.getCollection('student').update({sage:21},{$inc:{sage:-2}},false,true)
#将年龄是20岁学生的性别修改为女;
db.getCollection('student').update({sage:20},{$set:{sex:"女"}})
#将女同学的年龄增加1岁;
db.getCollection('student').update({sex:"女"},{$inc:{sage:1}})
#将男同学的出生日期删除;
db.getCollection('student').update({sex:"男"},{$unset:{sbirthday:1}} ,false,true)
#将20岁学生的书籍追加Python,JavaScript,保证书籍数量不变;
db.getCollection('student').update({sage:20},{"$pushAll":{books:["Python","JavaScript"]}},false,true) 
#将姓李的学生的书籍追加C++;
db.getCollection('student').update({sname:/李/i},{$push: {books: "C++"}},false,true)
#给范明硕的信息增加舞蹈字段;
db.getCollection('student').update({sname: "范明硕"},{"$addToSet": {"course": "舞"}}) 
#将张三的第一个课程删除;
db.getCollection('student').update({"sname": "张三"}, {"$pop": {"course": -1}})
#删除王五的最后一个课程;
db.getCollection('student').update({"sname": "王五"}, {"$pop": {"course": 1}})
#删除夏传森中三门课程;
db.getCollection('student').update({"sname": "夏传森"}, {"$pullAll": {"books": ["Python", "C++", "Java"]}})
#将范明硕的sname字段名修改为姓名。
db.getCollection('student').update({"sname": "范明硕"}, {"$rename": {"name": "姓名"}})

索引

  1. 创建索引
#为student集合中的name(升序),sage(降序)创建唯一索引,并将索引命名alpha。
db.student.ensureIndex({name:1,sage:-1},{unique:true,name:"alpha"})
#为student集合中的parents内嵌文档中的age(升序)创建普通索引
db.student.createIndex({"parents.age":1})
#为student集合中的OS课程创建升序索引,并将索引名字命名为OSIndex
db.student.ensureIndex({course:1},{name:"OSIndex"})
  1. 删除索引
#将student集合中给OS创建的索引删除
db.student.dropIndex("OSIndex")
  1. 地理空间索引
#================================使用$geoWithin 查询某个形状内的点=================
$box 矩形,使用{$box:[[x1,y1],[x2,y2]]}
$center 圆形,使用 {$center:[[x,y],r]}
$polygon 多边形,使用 {$polygon:[[x1,y1],[x2,y2],[x3,y3]]}
#===========================================================地理空间索引
定义:找到距离当前位置最近的N个场所,为坐标查询提供的专门索引
#创建2d索引(方形空间索引)
db.start.ensureIndex({gps:”2d”},{min:-1000,max:1000})
#利用2d索引查找“肯德基”($near)

#利用2d索引查找地铁站

#查找范围在坐标相差2度以内的文档($geoNear)

#创建d2sphere索引

#搜索某一地理位置2千米内的文档

#=========================================================创建map集合
#为map集合添加2D索引
db.map.ensureIndex({"gis":"2d"},{min:-1,max:201})
#查询点(70,180)最近的3个点
db.map.find({"gis":{$near:[70,180]}},{gis:1,_id:0}).limit(3)
#查询以点(50,50)和点(190,190)为对角线的正方形中的所有的点
 db.map.find({gis:{"$within":{$box:[[50,50],[190,190]]}}},{_id:0,gis:1})
#查询出以圆心为(56,80)半径为50规则下的圆心面积中的点
db.map.find({gis:{$within:{$center:[[56,80],50]}}},{_id:0,gis:1})
#查看集合中已经创建的索引。
db.集合名.getIndexes()

零散内容

#在当前数据库下 规定_id
db.createCollection("stu")
db.stu.insert({_id:001,name:"job"})
#不同
#已存在数据:{_id:1,"name":"n1" },再次进行插入操作时,
insert({_id:1,"name":"n2"})    #会报主键重复的错误提示
save({ _id:1,"name":"n2"})     #会把 n1 修改为  n2 
#相同
#新增数据中没有主键,两者都会增加一条记录

read:用户具有读取当前数据库中任何集合的权限

readAnyDatabase:用户具有读取所有数据库中任何集合的权限

readWrite:提供所有读取权限,并让用户能够写入当前数据库中任何集合,包含插入、删除、更新文档以及创建、重命名和删除集合。

readWriteAnyDatabase:与readWrite相同,但指的是多有数据库。

dbAdmin:让用户能够读写当前数据库以及清理、修改、压缩、获取统计信息和执行检查

dbAdminAnyDatabase:与dbAdmin相同,但指的是所有数据库

clusterAdmin:让用户能够管理MongoDB,包括了按揭、集群、复制、列出数据库、创建数据库和删除数据库。

userAdmin:让用户能够在当前数据库中创建和修改用户账户

userAdminAnyDatabase:与userAdmin相同,但指的是所有数据库

例子:

db.createUser({user: "testuser",pwd: "test",roles:["readWrite", "dbAdmin"]})

上一篇下一篇

猜你喜欢

热点阅读