mogodb
1、brew install mongodb
2、启动mongo服务 mongod -config /usr/local/etc/mongod.conf
3、/usr/local/etc/mongod.conf :所有数据保存的位置、日志信息都在此文件中、端开口号配置等都在这里记录
systemLog:
destination: file
path: /usr/local/var/log/mongodb/mongo.log
logAppend: true
storage:
dbPath: /usr/local/var/mongodb
net:
bindIp: 127.0.0.1
4、切换到admin数据库:use admin
关闭当前终端:db.shutdownServer()
5、基础操作
5.1 创建数据库 :use mldn
显示数据库:show databases
5.2 创建集合:db.createCollection('emp')
显示数据库:show databases
5.3 向一个不存在的集合中插入数据:db.dept.insert({"deptno":10,"dename":"财务部","loc":"北京"})
查看所有集合:show collections
插入不规则数据
var deptData = {
"deptno":20,
"dename":"研发部",
"loc":"上海",
"count":20,
"avg":8000.0
};
db.dept.insert(deptData) ;
db.dept.insert({"deptno":30,"dename":"市场部"})
【注意】:此时数据可以由用户随意指定,不用考虑同一个集合中其他数据的结构,所以在mongo中没有查看集合结构的命令,因为每一条数据可能结构都不同
5.4 查询集合数据:
db.dept.find()
db.dept.findOne()
5.5 关于ID:"_id" : ObjectId("59ad52c3c53ac106b3c4b1cb")
5.6 删除数据
db.dept.remove({"_id" : ObjectId("59ad52c3c53ac106b3c4b1cb")})
5.7 更新数据
var deptData = {
"deptno":20,
"dename":"乞讨部",
"loc":"家里蹲",
"count":20,
"avg":8000.0
};
db.dept.update({"_id" : ObjectId("59ad5469c53ac106b3c4b1cc")},deptData);
5.8 删除集合:
db.dept.drop()
5.9 删除数据库:
db.dropDatabase()
6、数据增加:db.集合.insert()
6.1 db.infos.insert({"url":"www.baidu.com"})
6.2 db.infos.insert([{"url":"www.qq.com"},{"url":"www.taobao.com"}])
6.3 保存10000条数据,与javascript语法差不多
for(var i = 0 ; i< 10000;i++){
db.infos.insert({"url":"mldn-"+i})
}
在此查询会显示20条默认,然后下方显示“Type "it" for more”,意思是输入it就显示下一页,it回车
7、数据查询:db.集合.find({查询条件},[,{设置显示的字段}])
7.1 :db.infos.find()
7.2 :db.infos.find({"url":"www.baidu.com"})
7.3 :db.infos.find({"url":"www.baidu.com"},{"_id":0})
7.4 :db.infos.find({"url":"www.baidu.com"},{"_id":0}).pretty()
8、关系运算(大于($gt)、小于($lt)、大于等于($gte)、小于等于($lte)、等于(key:val、$eq)、不等于($ne))
准备测试数据:
db.students.insert({"name":"张三","sex":"男","age":19,"score":89,"address":"海淀区"})
db.students.insert({"name":"李四","sex":"女","age":20,"score":59,"address":"朝阳区"})
db.students.insert({"name":"王五","sex":"女","age":19,"score":99,"address":"西城区"})
db.students.insert({"name":"赵六","sex":"男","age":20,"score":100,"address":"东城区"})
db.students.insert({"name":"小七","sex":"男","age":19,"score":20,"address":"海淀区"})
db.students.insert({"name":"王八","sex":"女","age":21,"score":0,"address":"海淀区"})
db.students.insert({"name":"刘九","sex":"男","age":19,"score":70,"address":"朝阳区"})
db.students.insert({"name":"钱十","sex":"女","age":21,"score":56,"address":"西城区"})
8.1 (等于)查询姓名 “张三”
db.students.find({"name":"张三"})
8.2 (大于)查询年龄大于19岁的
db.students.find({"age":{"$gt":19}})
8.3 (大于等于) 查询成绩大于等于60分的
db.students.find({"score":{"$gte":60}})
8.4 (不等于) 查询姓名不是“王五”
db.students.find({"name":{"$ne":"王五"}})
9、逻辑运算(与("$and")、或("$or")、非("$not"、"$nor"))
9.1 (与) 查询大于等于19并且小于等于20的人
db.students.find({"age":{"$gte":19,"$lte":20}})
9.2 (非) 查询年龄不是19岁的人
db.students.find({"age":{"$ne":19}})
9.3 (或)年龄大于19岁,或者成绩大于90分的学生
db.students.find({
"$or":[
{"age":{"$gte":19}},
{"score":{"$gte":90}}
]
})
9.3($nor)年龄不大于19或者成绩不大于90
db.students.find({
"$or":[
{"age":{"$gte":19}},
{"score":{"$gte":90}}
]
})
10、求模($mod):{"$mod":[数字,余数]}
db.students.find({"age":{"$mod":[20,0]}})
db.students.find({"age":{"$mod":[20,1]}})
11 、范围查询($in:在范围之中,$nin:不在范围之中)
db.students.find({"name":{"$in":['张三','李四','王五']}})
db.students.find({"name":{"$nin":['张三','李四','王五']}})
12、数组查询(mongo支持数组保存)
先保存一部分数组数据:
db.students.insert({"name":"谷大神 - A","sex":"女","age":19,"score":80,"address":"西城区","course":['语文','数学','英语']})
db.students.insert({"name":"谷大神 - B","sex":"女","age":28,"score":56,"address":"东城区","course":['体育','数学','英语']})
db.students.insert({"name":"谷大神 - C","sex":"男","age":21,"score":71,"address":"朝阳区","course":['语文','美术','英语']})
db.students.insert({"name":"谷大神 - D","sex":"女","age":24,"score":62,"address":"西城区","course":['计算机','数学','英语']})
12.1 针对数组判断运算符($all,$size,$slice,$elemMatch)
$all:查询同时参加”语文“和”数学“的学生
db.students.find({"course":{"$all":["语文","数学"]}})
数组索引:查询课程(下标从0开始)第二个内容为数学的信息
db.students.find({"course.1":"数学"})
$size :查询3报了三个课程的学生
db.students.find({"course":{"$size":2}})
$slice:返回年龄是19岁信息,但是要求只显示参加的前2门课程
db.students.find({"age":19},{"course":{"$slice":2}})
db.students.find({"age":19},{"course":{"$slice":2}})
db.students.find({"age":19},{"course":{"$slice":[1,2]}})
13、嵌套集合运算:$elemMatch
先保存一部分数组数据:
db.students.insert({"name":"吕大神 - A","parents":[{"name":"A父亲","job":"工人"},{"name":"A母亲","job":"职员"}]})
db.students.insert({"name":"吕大神 - B","parents":[{"name":"B父亲","job":"医生"},{"name":"B母亲","job":"教师"}]})
db.students.insert({"name":"吕大神 - C","parents":[{"name":"C父亲","job":"局长"},{"name":"C母亲","job":"医生"}]})
db.students.insert({"name":"吕大神 - D","parents":[{"name":"D父亲","job":"工人"},{"name":"D母亲","job":"局长"}]})
13.1 查询 ”吕大神 - A","吕大神 - B","吕大神 - C“ 三个同学的父母是医生的
db.students.find({"$and":[
{"name":{"$in":["吕大神 - A","吕大神 - B","吕大神 - C"]}},
{"parents":{"$elemMatch":{"job":"医生"}}}
]})
【注】:尽量不要讲数据构造成这样,太麻烦
14、判断字段是否存在 :$exists
14.1 查询带有parents成员的数据
db.students.find({"parents":{"$exists":true}})
14.2 查询不具有course成员的数据
db.students.find({"course":{"$exists":false}})
【注】:尽量保存时间结构一致
15、条件过滤:$where
15.1 单个条件
db.students.find({"$where":"this.age > 20"})
db.students.find("this.age > 20")
db.students.find(function(){
return this.age > 20
})
db.students.find({"$where":function(){
return this.age > 20
}})
【注】:以上三个结果是一致的,所以对于$where是可以简化的,但是对于数据量比较大的不推荐使用,严格来讲是编写一个操作的函数一个一个去过滤
15.2 多个条件:
查询大于19小于21的人
db.students.find({"$and":[
{"$where":"this.age > 19"},
{"$where":"this.age < 21"},
]})
【注】$where能利用javascript进行查询,但是把bson重新变成javascript循环验证,无法再利用到索引,效率低,再整个mongo中索引提升非常明显
16、正则运算、模糊查询:如果想实现模糊查询,必须使用正则表达式,使用的是Perl兼容的正则表达形式
16.1 语法
基础语法:{key : 正则标记}
完整语法:{key:{"$regex":正则标记,"$options":选项}}
options:
i:忽略大小写 (最常用)
m:多行查找
x:空白字符除了呗转移或在字符类中意外的完全被忽略
s:匹配所有的字符(圆点”.“)包括换行内容
如果直接使用(javascript),那么只能使用i与m(常用),而s与x必须使用$regex(基本用不到)
16.2 查询name上包含”谷“的人
db.students.find({"name":/谷/)
db.students.find({"name":/a/i)
db.students.find({"name":{"$regex":/a/}})
16.3 正则查询数组数据
db.students.find({"course":/语/})
db.students.find({"course":/语?/})
17、数据排序(升序:1 、降序:-1)
17.1 根据成绩降续 : db.students.find().sort({"score":-1})
17.2 自然排序(按照保存进去的顺序倒叙) :db.students.find().sort({"$natural":-1})
18、数据分页
skip(n):相当于sql中的offset,跳过多少个
limit(n)
18.1 根据age降续分页
db.students.find().skip(0).limit(5).sort({"age":-1})
19、数据更新(更新函数):save、update
19.1 update语法:db.集合.update(条件,更新的数据,upsert,multi)
upsert:更新的数据不存在,则新加一条,true为增加,false不增加
multi:表示是否只更新到查询出来的第一条数据,false只更新第一个,true全部更新
eg:将年龄是19岁的人成绩都更新到100分(会返回多条数据)
只更新第一条数据:db.students.update({"age":19},{"$set":{"score":100},false,false})
更新所有:db.students.update({"age":19},{"$set":{"score":100},false,true})
不存在插入:db.students.update({"age":190},{"$set":{"score":100}},true,false)
$set:修改器,不止能改数据,还能改集合等
19.2 save:db.集合.save({条件,更新数据})
修改存在的数据:db.students.save({"age":190,score:0})
修改不存在的数据:db.students.save({"age":191,score:0})
【注】:多用update灵活
20、修改器
20.1 $inc : 主要针对于一个数字字段,增加数字字段的内容
语法 :{"$inc":{"成员":"内容"}}
例子:将所有19岁人成绩减少30分、年龄+1岁
db.students.update({"age":19},{"$inc":{"score": -30,age : +1}})