MongoDB 的增删改查

查找操作

mysql  :   select  *  from  table  where ....

mongodb  :  db.collection.find(query,field)

find(query,field)
功能 : 查找数据
参数 :  query   筛选条件,相当于where子句
         field   选择要展示的域
返回值 : 返回查找到的文档

db.collection.find()  --->  select * from table

query : 以键值对的形式给出查找条件
    e.g.    db.class0.find({name:"Lucy"})

field : 以键值对的形式给出要展示(不展示的域)
         域名为键,0为值表示不显示该域
               1 为值表示显示该域

* 如果使用0设置某些域不显示则默认其他域显示
  如果使用1设置某些域显示则默认其他域不显示
* _id 只有设置为0才不显示否则默认显示
* 除_id域,其他域必须同时设置为0或者1
* 如果不写该参数则表示显示所有内容

e.g. 
db.class1.find({sex:'m'},{_id:0,name:1,age:1})

findOne(query,field)
功能 : 查找符合条件的第一条文档
参数: 同find
返回值 : 查找到的文档

e.g. 
 db.class0.findOne({age:17},{_id:0})


query更丰富用法

操作符 : 使用$号注明的一个特殊意义字串,表达某个特          定含义。比如 $gt 表示大于

比较操作符

$eq  等于

e.g.   年龄等于17
db.class0.find({age:{$eq:17}},{_id:0})

$lt  小于  <

e.g.
db.class0.find({name:{$lt:"Tom"}},{_id:0})

* 字符串也可以比较大小

$lte  小于等于  <=

e.g.
db.class0.find({age:{$lte:17}},{_id:0})

$gt   大于  >
db.class0.find({age:{$gt:17}},{_id:0})

$gte  大于等于  >=
db.class0.find({age:{$gte:17}},{_id:0})

$ne   不等于   != 

db.class0.find({age:{$ne:17}},{_id:0})


$in  包含

e.g.  查找年龄在[16 18]  中的
db.class0.find({age:{$in:[16,18]}},{_id:0})

$nin  不包含

e.g.  不是16 17的都找到
db.class0.find({age:{$nin:[16,17]}},{_id:0})


逻辑操作符

$and 

* query 中如果多个条件用逗号隔开即为and关系

e.g. 
年龄为17 并且为 男
db.class0.find({age:17,sex:'m'},{_id:0})
年龄大于13并且小于18
db.class0.find({age:{$gt:13,$lt:18}},{_id:0})

使用 $and

e.g.  年龄为17 并且为 男
db.class0.find({$and:[{age:17},{sex:'m'}]},{_id:0})

$or 逻辑或

e.g.  年龄大于30或性别为女
db.class1.find({$or:[{age:{$gt:30}},{sex:'w'}]},{_id:0})

$not  逻辑非

年龄不等于17
db.class0.find({age:{$not:{$eq:17}}},{_id:0})


$nor   既不也不

e.g.  查找年龄不等于17,性别不为男的
db.class0.find({$nor:[{age:17},{sex:'m'}]},{_id:0})

条件混合
(年龄大于30 并且叫阿宝) 或者 性别为 w

db.class1.find({$or:[{age:{$gt:30},name:'阿宝'},{sex:'w'}]},{_id:0})

(年龄小于30或者大于33) 并且  性别为 w
db.class1.find({$or:[{age:{$lt:30}},{age:{$gt:33}}],sex:'w'},{_id:0})

数组

表达 : 使用中括号将一定的数据组织成一种数据结构

* 数组中的数据类型可以不同
* 数组是有序的

e.g.  数组值中只要有任意一项大于90即可
 db.class2.find({score:{$gt:90}},{_id:0})

$size 
通过数组中元素的个数查找

e.g.   查找数组中包含两项的文档
db.class2.find({score:{$size:2}},{_id:0})

$all  
查找数组中同时包含多项的文档

e.g. 数组中同时包含88和90
db.class2.find({score:{$all:[88,90]}},{_id:0})

$slice
取数组的部分进行显示,在field中声明

e.g.  显示数组中前两项
 db.class2.find({},{_id:0,score:{$slice:2}})

e.g.   跳过第一项显示后面两项
 db.class2.find({},{_id:0,score:{$slice:[1,2]}})


其他query查询

$exists
判断一个域是否存在

e.g. 查找有sex域的文档(true表示存在,false表示不存在)
 db.class0.find({sex:{$exists:true}},{_id:0})

$mod 
余数查找

e.g.  除以2余1的
db.class0.find({age:{$mod:[2,1]}},{_id:0})

$type
数据类型查找

e.g. 查找age值类型是1的
db.class1.find({age:{$type:1}},{_id:0})

操作符用法文档查找
www.mongodb.com ---> docs ---->search


查找结果的进一步操作

distinct()
功能 : 查看集合中某个域的取值范围

e.g.  查看年龄的取值范围
 db.class1.distinct('age')

pretty()
功能 : 将查询结果格式化显示

e.g.  db.class1.find().pretty()


limit(n)
功能 : 显示查找结果的前n条文档

e.g.  显示查找到的文档的前3条
db.class1.find({},{_id:0}).limit(3)

skip(n)
功能 : 跳过前n条显示后面的内容

e.g.  跳过查找到的前三条,显示后面的内容
 db.class1.find({},{_id:0}).skip(3)

count()
功能 : 计数统计

e.g. 统计查找数量
db.class1.find({},{_id:0}).count()


sort({field:1/-1})
功能 : 对查找结果排序
参数 : 以键值对形式给出,键表示按照哪个域排序
         1表示升序,-1表示降序

e.g.  对查找结果按照年龄升序排序
db.class1.find({},{_id:0}).sort({age:1})

复合排序: 当第一排序项相同的时候按照第二排序项排序,以此类推

e.g.  当年龄相同时,按照姓名进行排序
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)

remove(query,justOne)
功能 : 删除文档
参数 : query  筛选要删除的文档,相当于where
               用法同 查找
    justOne   布尔值  
        默认为False 表示删除所有复合条件的文档
            如果设置为true 则表示只删除第一条复合条件文档

e.g.  删除年龄域值不是数字类型的
 db.class1.remove({age:{$not:{$type:1}}})

e.g.  删除第一个年龄为17的文档
db.class0.remove({age:17},true)


删除一个集合中所有文档
db.collection.remove({})

e.g.  删除class0中所有文档
db.class0.remove({})


练习 :
1. 创建数据库 名字 grade
use grade

2. 数据库中创建集合 名字  class
3. 集合中插入若干文档格式如下
{name:'zhang',age:10,sex:'m',hobby:['a','b'...]}
年龄在4-13之间
hobby几项都可以,可选项: draw  sing  dance  basketball  football  pingpong  running  computer 

db.class.insert({name:'zhang',age:10,sex:'m',hobby:['a','b'...]})


4. 查询练习
查看班级所人信息
find()

查看年龄大于10岁的学生信息
find({age:{$gt:10}})

查看年龄 8-11 岁之间的学生信息
find({age:{$gt:8,$lt:11}})

找到年龄9岁且为男生的学员
find({age:9,sex:'m'})

找到年龄小于7岁或者大于11岁的学生
find({$or:[{age:{$gt:11}},{age:{$lt:7}}]})

找到年龄8岁或者11岁的学生
find({age:{$in:[8,11]}})

找到有两项兴趣爱好的学生
find({hobby:{$size:2}})

找到喜欢computer的学生
find({hobby:"computer"})

找到既喜欢画画,又喜欢跳舞的学生
find({hobby:{$all:['draw','dance']}})

统计兴趣爱好有3项的学生人数
find({hobby:{$size:3}}).count()

找到本班年龄第二大的学生
find({}).sort({age:-1}).skip(1).limit(1)

查看学生学生兴趣爱好的范围
db.class.distinct('hobby')

找到年龄最小的三个同学
find({}).sort({age:1}).limit(3)

删除虽有年龄小于6岁或者大于12岁的学员
remove({$or:[{age:{$lt:6}},{age:{$gt:12}}]}) 

修改操作

mysql : update table set ... where ... 

mongodb : db.collection.update(query,update,upsert,multi)

功能 : 修改文档
参数 : query  筛选要修改的文档,相当于where
               用法同查找
    update :将筛选的文档修改为什么内容,相当于          set。 需要配合修改操作符一同使用。
    upsert : bool值,默认为false。如果query的文档          不存在则不进行任何操作
             如果设置为true则如果query的文档不存在就根据query和update插入新文档
    multi : bool值,默认为false。如果query文档有          多条则只修改第一条
             如果设置为true 则修改所有符合条件文档

e.g.  将小白年龄改为31
db.class1.update({name:'小白'},{$set:{age:31}})

e.g. 修改文档,如果文档不存在则插入
db.class1.update({name:'阿蓉'},{$set:{age:29}},true)

e.g.  如果有多个年龄小于32的则全部修改
db.class1.update({age:{$lt:32}},{$set:{age:28}},false,true)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值