创建数据库
use + 数据库名称
use会创建一个数据库,如果这个数据库存在,那么返回这个数据库
示例
创建一个数据库skdb
use skdb
使用db命令查看当前选定的数据库
db
使用show dbs命令来检查数据库列表
show dbs
插入新的文档到集合中
db.student.insert{
stuid : 1,
stuname : "xxx"
}
删除数据库
db.dropDatabase
范例
sue sdkb
db.dropDatabase()
插入文档
若不存在,插入新文档时会自动创建一个新的集合,再插入.
db.collection.insertOne():向指定的集合插入一条数据
db.collection.insertMany():向指定的集合中插入多条数据
db.users.insertOne(
{
name:"sue",
age:22,
status:"xxx"
}
)
向users插入多条文档
db.users.insertMany(
[{
name:"zzxb",
age:18,
status:"xxx"
},
{
name:"ilyj",
age:38,
status:"stop"
}
]
)
更新文档
db.collection.update(
<query>,
<update>,
{
upsert:<boolean>,
multi:<boolean>,
writeConcern:<documnet>
}
)
参数说明:
- query:update的查询条件,类似sql update查询内where后面的
- update:update的对象和一些更新的操作符号
- upsert:可选 若不存在update的记录,是否插入objNew,true为插入,默认为false,不插入
- multi:可选,只更新找到的第一条记录,true:把按条件查出来的多条记录全部更新
- writeConcern:可选 抛出异常的级别
3.2版本开始 MongoDB提供以下更新集合文档的方法
db.collention.updateOne()
db.collection.updateMany()
范例
将name为zzxb的文档,更新年龄为40
db.user.update(
{"name":"zzxb"},
{$set:{"age":40}}
)
将年龄小于30的文档,更新状态为stop
db.users.update(
{"age":{$lt:30},
{$set:{"status":"stop"}}
}
)
大于小于
- lt : 小于
- gt: 大于
- lte : 小于等于
- gte : 大于等于
- ne: 不等于
save语法
save()方法通过传入的文档来替换已有的文档
db.collection.save(
<document>,
{
writeConcern:<document>
}
)
- document:文档数据
- writeConcern:可选的,抛出异常的级别
替换id为5a67ea03fd6b999d262bae2c的文文档内容
db.users.save({
_id:ObjectId("5a67..."),
name:"myzzxb",
age:28,
status:"starting"
})
修改器
通常文档只会有一部分要更细,使用原子性的更新,指定文档的某些字段进行更新
更新修改器是钟特殊的键.用来指定复杂的更新操作:修改,增加 删除,还可能是操作数据或内嵌文档
$inc:修改器⽤用来增加已有键的值,或者该键不存在那就创建⼀一个
新建集合
db.fangwencount.insert(
[
{
url:"www.163.com",
pageviews:52
},
{
url:"www.sina.com.cn",
pageviews:52
} ]
)
使用$inc修改访问次数
db.fangwencount.update(
{url:"www.sina.com.cn"},{$inc:{pageviews:2}}
)
$inc键的值必须为数
$set指定一个字段的值 如果不存在那么创建
db.students.insert(
{
name:"zzxb", age:19, sex:"男"
} )
添加学生爱好
db.sutdent.update(
{
name:''zzxb''
},{
$set:{aihao:"football"}
}
)
再添加一个爱好
db.student.update(
{
name:"zzxb"
},
{
$set:{aihao:"football","basletball"}
}
)
$unset可以删除字段
删除aihao的键值
bd.sutdent.update(
{
name:"zzxb"
},
{
$unset:{aihao:null}
}
)
数组修改器
数组是很有用的数据结构
可通过索引进行引用的列表
还可以作为数据集采用
添加元素
若数组存在
$push会向数组末尾添加一个元素
没有数组就创建一个新的数组
新增集合
db.blog.posts.insert(
{
title:"mongdb操作⼿手册",
content:"这是⼀一份mongdb操作⼿手册",
addtime:new Date()
}
)
$push添加元素
db.blog.post.updateOne(
{
title:"mongodb操作手册"
},
{
$push:{
comment:{
name:"ifeng",
email:"xxx@163.com",
addtime:new Date()
}
}
}
)
再次添加评论
db.blog.posts.updateOne(
{
title:"mongo操作手册"
},
{
$push:{
comment:{
name:"asdfj",
email:"asdfa@163.com",
addtime:new Date()
}
}
}
)
$each,可以通过一次 $push操作添加多个值
添加一个新的likes字段,用于记录点赞的人
db.blog.posts.updateOne(
{
title:"mongodb操作手册"
},
{
$push:{
$each:[{name:"aa"},{name:"bb"},{name:"cc"}]
}
}
)
$addToSet向数组添加不重复的元素
向like字段添加重复的元素
db.blog.posts.update(
{
title:"mongo操作手册"
},{
$addToSet:{
likes:{
name:"cc"
}
}
}
)
$pop $pull $pullAll
$pop指定数组删除的值 1:最后一个 -1:第一个
{$pop:{name:1}}
$pull删除被指定的值
{$pull:{name:"cc"}}
$pullAll:一次性删除多个指定的值
{$pullAll:{name:["js","JAVA"}}
使用占位符$操作嵌套文档
db.blogs.posts.update(
{_id:ObjectId("aksjdf;lka","comment.uname":"zzxb")},
{$set:{"comment.$.cotent":"ok"}}
)
注意:目前mongo不支持多个$
updataMany()
更新文档
findAndModify()能够在⼀个操作中返回匹配结果并且进⾏更新。
删除文档
语法1
db.collection.deleteOne(
<filter>,
{
writeConcern: <document>,
collation: <document>
}
)
语法2
db.collection.deleteMany(
<filter>,
{
writeConcern: <document>,
collation: <document>
}
)
参数说明:
filter : 条件
writeConcern :可选,抛出异常的级别。
collation:可选,排序⽅式⾃定义
删除ifeng用户
db.users.deleteOne(
{name:"ifeng"}
)
查询⽂档
插入模拟的数据
查询语法
db.collection.find(query,projection)
参数说明:
query :可选,使⽤查询操作符指定查询条件
projection :可选,使⽤投影操作符指定返回的键。查询时返回⽂档中所有键值, 只需省略该
参数即可(默认省略)。
查询所有文档 并且显示所有字段
db.users.find()
查询全部文档 并且显示name字段
db.users.find({},{name:1})
_id键默认返回 需要指定——id:0才会隐藏
db.userts.fidn({},{_id:0,name:1})
条件操作符
条件操作符⽤于⽐较两个表达式并从mongoDB集合中获取数据。
通过下表可以更好的理解 MongoDB 的条件操作符语句:
查询年龄等于30的用户
db.users.find(
{age:30}
)
查询年龄大于28的用户
db.users.find(
{age:{$ge:28}}
)
查询年龄大于等于30岁的用户
db.users.find(
{age:{$gte:30}}
)
And条件
语法:
db.collection.find({key1:value1,key2:valuse2})
查询年龄大于30 状态位ok的用户
db.users.find(
{
age:{$gt:30},
status:"ok"
}
)
OR条件
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
)
查询年龄大于30 或者状态时stop的用户
db.users.fidn(
{
$or:[
{age:{$gte:30}},
{status:"stop"}
]
}
)
查询出指定键
db.[集合名].find({条件},{键指定})
db.students.find({},{_id:0,stuname:1,city:1})
查询出年龄在25到27岁之间的学生
db.student.find({age:{$get25,$lte:27}})
包含 不包含($ in/$sin)
查询出所有(bu)是济南或者烟台的学生信息
db.mystu.find(
{
city:{$(n)in:["jinan","yantia"]}
}
)
OR查询
查询所有高考成绩大约79或者Hadoop成绩大于80的学生信息
db.mystu.find(
$or:{
{java:{$gt:79}},
{hadoop:{$gt:80}}
}
)
把所有济南学生信息添加sex字段 并设置位man
db.mystu.updateMany(
{city:"jinan"},
{$set:{sex:"man"}}
)
模糊查询 正则表达式
//查询出名字中含有zz的信息
db.mystu.find(
{stuname:/zz/}
)
db.mystu.find(
{stuname:{$regex:"zz"}}
)
//不区分大小写
db.mystu.find(
{stuname:/zz/i}
)
db.mystu.find(
{stuname:{$regex:"zz",$options:"$i"}}
)
$regex与正则表达式对象的区别:
在KaTeX parse error: Expected '}', got 'EOF' at end of input: …达式对象,例如:{name:{in:[joei,jack}}
在使⽤隐式的
a
n
d
操
作
符
中
,
只
能
使
⽤
and操作符中,只能使⽤
and操作符中,只能使⽤regex,例如:{name:{$regex:^joi, KaTeX parse error: Expected 'EOF', got '}' at position 13: nin:['john']}̲} 当option选项中包含X…regex,例如:{name:{$regex:m.line,
$options:“si”}}
not使⽤
查询出所有名字不含有“zz”的学⽣信息
db.mystu.find(
{stuname:{$not:/zz/}}
)
注意$ not不能与$ regex同时使⽤
数组查询$ all和$ index应⽤
查询出拥有MONGODB和html书籍的学⽣
db.mystu.find(
{books:{$all:["html","MONGODB"]}}
)
查询出拥有第⼆本书是java书籍的学⽣
db.mystu.find(
{"books.1":"java"}
)
数组⻓度 $ size
查询出拥有四本书籍的所有学⽣信息
db.mystu.find(
{books:{$size:4}}
)
查询出拥有⼤于三本书籍的所有学⽣信息
db.mystu.find(
{books:{$size:{$gt:3}}}
)
⽆法实现, $ size⽆法与$ gt, $lt等⽐较符同时使⽤
1.新增⼀个书籍数量的字段
db.mystu.updateMany({},{$set:{num:4}})
2.给zzxb学⽣,新增⼀本regex书籍
db.mystu.update(
{stuname:"zzxb"},
{$push:{books:"regex"},
$inc:{num:1}}
)
3.查询⼤于4本书的学⽣
db.mystu.find({num:{$gt:4}})
$slice
查询出zzxb学⽣,拥有的第2到第4本书
db.mystu.find(
{stuname:"zzxb"}, { books: { $slice: [ 1, 4 ] } }
)
查询出zzxb学⽣,拥有的最后⼀本书
db.mystu.find(
{stuname:"zzxb"}, { books: { $slice: -1 } }
)
⽂档查询
为zzxb,添加新的学习简历集合
var zzxb = [
{school:"善林路⼩学",score:"A"},
{school:"140初中",score:"B"},
{school:"109⾼中",score:"A+"}
]
插⼊
db.students.update({stuname:"zzxb"},
{$set:{school:[
{school:"善林路⼩学",score:"A"},
{school:"140初中",score:"B"},
{school:"109⾼中",score:"A+"}]
}});
查询在109中学,上过学的学⽣
匹配查询:
db.students.find({school:{school:"109⾼中"}});
⽆法查询出结果,必须要完全匹配
db.students.find({school:{school:"109⾼中",score:"A+"}});
点“.”定位器:
db.students.find({"school.school":"109⾼中"})
查询出在140初中且成绩为A的学⽣
db.students.find(
{"school.school":"140初中","school.score":"A"})
查询错误,查出不符合要求的记录
使⽤用$elemMatch查询⼦子⽂文档
db.students.find({school:{$elemMatch:{school:"140初中",score:"A"}}});
db.students.find({school:{$elemMatch:{school:"140初中"}}});
where复杂查询
JS字符串串⽅方式:
db.students.find({$where:"this.age > 25"});
Js函数⽅方式
db.students.find({$where:
function() {
if (this.age > 25 && this.age < 30){
return this;
} }
});
复杂:
db.students.find({$where:function (){
if(this.city == 'jinan'){
for(var i = 0;i < this.books.length;i++){
var java = this.books[i];
if(java == 'oracle'){
return this;
} }
} }});
分⻚页与排序
limit、skip
查询出前五条记录
db.students.find({},{stuname:1}).limit(5);
查出5-10条记录 db.students.find({},
{stuname:1}).limit(5).skip(5);
sort排序 倒序:
db.students.find({},{stuname:1,age:1}).limit(5).skip(5).sort({age:-1});
正序:
db.students.find({},
{stuname:1,age:1}).limit(5).skip(5).sort({age:1});
游标
使用游标
var stu = db.student.find();
while(stu.hasNext()){
var. obj = stu.next();
print(obj.stuname);
}
游标销毁条件
- 客户端主动销毁
- 游标到底
- ⼗十分钟内游标没使⽤用,⾃自动销毁
索引
创建索引
db.books.ensureIndex({number:1});
索引使⽤用需要注意的地⽅方
- 创建索引:1是正序索引,-1是倒序索引
- 索引的创建在提⾼高查询性能的同时会影响插⼊入的性能。对于经常查询少插⼊入的集合可以考虑⽤用
索引。 - 符合索引要注意索引的先后顺序
- 每个键全建⽴立索引不不⼀一定就能提⾼高性能。
创建索引同时指定索引名字
db.books.ensureIndex({number:-1},{name:"ix_number"});
唯⼀一索引
db.books.ensureIndex({bookname:1},{unique:true});
Hint
如何强制查询使⽤用指定的索引
db.books.find({bookname:"bookname1"}).hint({bookname:1});
explain
查看本次查询使⽤用索引情况和查询数据的状况信息
db.books.find({bookname:"book1"}).explain(); db.books.find({bookname:"book23456"}).explain("executionStats");//version 3.0以 上
查看所有索引
db.system.indexses.find(); db.books.getIndexes();//version 3.0以上
后台执⾏行行创建索引
db.books.ensureIndex({bookname:1},{background:true});
删除索引
db.runCommand({dropindexes:"books",index:"ix_number"});
空间索引
创建2D索引
db.maps.ensureIndex({gis:"2d"},{min:-1,max:201});
默认会创建⼀一个【-180,180】之间的2D索引
案例例1
查询点(70,180)最近的三个点
db.maps.find({gis:{$near:[70,180]}}).limit(3);
案例例2
查询以点 (50,50)和点(190,190)为对⻆角线的正⽅方形中的所有点
db.maps.find({gis:{$within:{$box:[[50,50],[190,190]]}}});
案例例3 查询以点(50,50)为圆⼼心,半径为100规则下的圆下的所有点
db.maps.find({gis:{$within:{$center:[[50,50],150]}}});
备份与恢复
备份:
mongodump -h localhost -d skmongo -o /mydata
恢复:
mongorestore -h localhost:27017 -d skmongo /yundata/backup/mongo/skmongo