MongoDB day02
集合操作
- 获取集合对象
- 格式:
db.getCollection('class1') ===》 db.class1
- e.g.
db.getCollection('class1').insert({name:'Marry',age:16,sex:'w'})
- 格式:
查找操作
- mysql 和 mongo对比
- mysql : select … from table where ….
- mongo : db.collection.find(query,field)
查找所有内容
db.collection.find() ----> select * from table
find(query,field)
- 功能 : 查找数据
- 参数 : query: 筛选条件,相当于where子句
field: 选定要展示的域 返回值 : 返回查找到的文档
query : 以键值对形式给出筛选条件
{name:'Lily'}
e.g. db.class1.find({name:’Lily’})
field : 以键值对的形式给出要展示(不展示)的域, 域名为键,值为1表示展示,0表示不展示
* 如果某个域设置为0则表示不展示该域其他的均展示 * 如果某个域设置为1则表示展示该域其他的均不展示 * _id必须设置为0才不会显示 * 除了_id其余设置的值必须相同
e.g.
db.class1.find({name:'Lily'},{_id:0,name:1,age:1})
findOne(query,field)
- 功能 : 只查找第一条复合条件的文档
- 参数返回值同find()
- e.g.
db.class1.findOne({sex:'w'},{_id:0})
- query 更多筛选功能
操作符
操作符:使用$符号标注的一个有特殊意义的字符串。用以表达一定的含义。比如 $lt 表示小于
- 比较操作符(* 字符串也可以比较大小, 如果某个文档不存在查找的域,则不等于可以匹配到该文档*)
符号 | 含义 | 例子 |
---|---|---|
$eq |
等于 | db.class1.find({age:{$eq:13}},{_id:0}) db.class1.find({age:13},{_id:0}) |
$lt |
小于 < | 年龄小于15: db.class1.find({age:{$lt:15}},{_id:0}) |
$lte |
小于等于 <= | 小于等于15:db.class1.find({age:{$lte:15}},{_id:0}) |
$gt |
大于 > | 大于15:db.class1.find({age:{$gt:15}},{_id:0}) |
$gte |
大于等于 >= | 大于等于15: db.class1.find({age:{$gte:15}},{_id:0}) |
$ne |
不等于 != | 不等于13:db.class1.find({age:{$ne:13}},{_id:0}) |
$in |
包含 | 年龄包含 在11,12,13,14的:db.class1.find({age:{$in:[11,12,13,14]}},{_id:0}) |
$nin | 不包含 | 年龄不是13,14:db.class1.find({age:{$nin:[13,14]}},{_id:0}) |
逻辑操作符
- query 逗号分隔的条件即为与关系
- e.g. 年龄大于13 小于16
> db.class1.find({age:{$gt:13,$lt:16}},{_id:0})
- e.g. 年龄大于13且性别为女
> db.class1.find({age:{$gt:13},sex:'w'},{_id:0})
- e.g. 年龄大于13 小于16
符号 | 含义 | 例子 |
---|---|---|
$and | 逻辑与 | 年龄大于13 :并且姓名大于Lily db.class1.find({$and:[{age:{$gt:13}},{name:{$lt:'Lily'}}]},{_id:0}) |
$or | 逻辑或 | 年龄大于15或者为男生:db.class1.find({$or:[{age:{$gt:15}},{sex:'m'}]},{_id:0}) |
$not | 逻辑非 | 年龄不大于15:db.class1.find({age:{$not:{$gt:15}}},{_id:0}) |
$nor | 既不也不 | 既不大于16 也不是女生:db.class1.find({$nor:[{age:{$gt:16}},{sex:'w'}]},{_id:0}) |
1. 条件混合
1. 年龄大于16并且为男生 或者 年龄小于14
db.class1.find({$or:[{age:{$gt:16},sex:'m'},{age:{$lt:14}}]},{_id:0})
1. 年龄大于16或者为女生 并且 姓名大于 Jame
db.class1.find({name:{$gt:'Jame'},$or:[{age:{$gt:16}},{sex:'w'}]},{_id:0})
符号 | 含义 | 例子 |
---|---|---|
$all |
查找数据中同时包含多项 | 同时包含64 75:db.class3.find({score:{$all:[64,75]}},{_id:0}) |
$size |
通过数组元素个数查找 | db.class3.find({score:{$size:3}},{_id:0}) |
$slice |
取出数组的部分进行显示 放在field中 | 显示数组中前两项:db.class3.find({},{_id:0,score:{$slice:2}}) 跳过第一项显示后面一项:db.class3.find({},{_id:0,score:{$slice:[1,1]}}) |
其他查找方法
符号 | 含义 | 例子 |
---|---|---|
$exists |
判断一个域是否存在 | 查找存在age域的文:db.class1.find({age:{$exists:true}},{_id:0} ) , true 表示有这个域 false表示筛选无这个域 |
$mod |
余数查找 | 查找除以2余数为1的: db.class1.find({age:{$mod:[2,1]}},{_id:0} ) |
$type |
找出值为指定类型的文档 | 查找age数据类型为1的文档 |
:db.class1.find({age:{$type:1}},{_id:0} ):
$Type具体数字和类型的匹配
Type | Number |
---|---|
Double | 1 |
String | 2 |
Object | 3 |
Array | 4 |
Binary data | 5 |
ObjectId | 7 |
Boolean | 8 |
Date | 9 |
Null | 10 |
RE | 11 |
Symbol | 14 |
32-bit integer | 16 |
Timestamp | 17 |
64-bit integer | 18 |
查找结果相关函数
符号 | 含义 | 例子 |
---|---|---|
distinct() | 功能:查看集合某个域的取值范围 | 查看集合中age域值的范围:db.class1.distinct("age") |
pretty() | 功能: 格式化显示查找结果 | db.class1.find().pretty() |
limit(n) | 功能: 显示查找结果的前n条 | 显示查找结果的前三条 :db.class1.find({},{_id:0}).limit(3) |
skip(n) | 功能 : 跳过前n条显示 | 跳过前三条显示后边的内容:db.class1.find({},{_id:0}).skip(3) |
count() | 功能 : 计数统计 | 统计男生数量:db.class1.find({sex:'m'},{_id:0}).count() |
sort({域:1/-1}) | 功能 : 对查找结果排序,参数 : 以键值对的形式给出,1 表示按照升序排序, -1表示降序排序 | 按照年龄升序:db.class1.find({},{_id:0}).sort({age:1}) |
1. 复合排序:当第一排序项相同时比较第二排序项
db.class0.find({},{_id:0}).sort({age:1,name:1})
函数的连续调用
当函数返回文档集合时还可以继续调用函数
e.g. 查找班级年龄最大的三个
db.class1.find({},{_id:0}).sort({age:-1}).limit(3)
文档的删除操作
- mysql格式: delete from table where …
mongodb格式: db.collection.remove(query,justOne)
- 功能 : 删除文档
- 参数 :
1. query 筛选要删除的文档 相当于where
用法同查找
2. justOne : 布尔值,默认为false 表示删除所有。如果设置为true 只删除第一条符合条件的文档。 e.g.
db.class2.remove({name:"阿蓉"})
e.g. justOne为true则只删除第一条符合条件的
db.class0.remove({age:17},true)
删除集合中所有文档
- e.g. 删除class2中所有文档
db.class2.remove({})
- e.g. 删除class2中所有文档
练习 :
- 创建数据库 名字 grade
use grade - 数据库中创建集合 class
- 集合中插入文档,格式如下
{name:’zhang’,age:10,sex:’m’,hobby:[‘a’,’b’]}
age范围 4-15
hobby 范围
[draw dance sing pingpong basketball football running computer]
- 创建数据库 名字 grade
查找练习
查看班级所有人信息
find()
查看班级年龄8岁的同学信息
find({age:8})
查看年龄大于10岁的学生信息
find({age:{$gt:10}})
查看年龄在8-11岁之间的学生信息
find({age:{$gte:8,$lte:11}}
查看年龄为9岁且为男生的学生
find({age:9,sex:'m'})
找到年龄小于7岁或大于12岁的学生
find({$or:[{age:{$lt:7}},{age:{$gt:12}}]})
找到年龄为8岁或者11岁的学生
find({age:{$in:[8,11]}})
找到有两项兴趣爱好的学生
find({hobby:{$size:2}})
找到兴趣中有draw的学生
find(hobby:'draw')
找喜欢画画又喜欢跳舞的学生
find(hobby:{$all:['draw','dance']})
统计兴趣有三项的学生人数
find({hobby:{$size:3}}).count()
找到本班年龄第二大的同学
find().sort({age:-1}).skip(1).limit(1)
查看兴趣的范围
找到年龄最小的三个同学
find().sort({age:1}).limit(3)
- 删除所有年龄大于12或者小于7岁的同学*
remove({$or:[{age:{$lt:7}},{age:{$gt:12}}]})
- 删除所有年龄大于12或者小于7岁的同学*
修改操作
- mysql格式:update table set … where …
mongodb格式:db.collection.update(query,update,upsert,multi)
- 功能 : 修改文档
- 参数 :
1. query : 筛选需要修改的文档,相当where
用法同查找
2. update: 要修改什么内容 相当set。往往需要配合修改操作符
3. upsert:bool值 默认false 如果query的文档不存在则不做操作
设置为true 则如果文档不存在根据query和update内容插入新文档
4. multi: bool值 默认false 如果删选到多条文档则只修改第一条。
设置为true则表示修改所有筛选到的文档 - e.g.
年龄修改为18:db.class0.update({name:'HanMei'},{$set:{age:18}})
e.g. 如果筛选内容不存在则插入
db.class0.update({name:'Jame'},{$set:{age:18}},true)
e.g. 如果匹配到多条,则修改所有
db.class0.update({sex:'w'},{$set:{name:'小芳'}},false,true)