(二)MongoDB

获取集合对象
db.getCollectijon('class') ===> db.class

e.g.
db.getCollection('class').insert({name:'Marry',age:16,sex:'w'})

查找操作

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'}  (查找name为Lily的数据)
e.g.   db.class.find({name:'Lily'})

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

* 如果某个域设置为0则表示不展示该域其他的均展示
* 如果某个域设置为1则表示展示该域其他的均不展示
* _id必须设置为0才不会展示
* 除了_id其余设置的值必须相同

e.g.
> db.class.find()
{ "_id" : ObjectId("5b502d5853d3e33218b24176"), "name" : "Lily", "age" : 18 }
{ "_id" : ObjectId("5b513a808102201b5d097d09"), "name" : "Marry", "age" : 16, "sex" : "w" }

> db.class.find({name:'Lily'},{_id:0,name:0})
{ "age" : 18 }

> db.class.find({},{_id:0,name:0})
{ "age" : 18 }
{ "age" : 16, "sex" : "w" }

> db.class.find({},{_id:0,name:0,age:0})
{  }
{ "sex" : "w" }

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

e.g.
db.class1.findOne({sex:'w'},{_id:0})

query 更多筛选功能

操作符:使用$符号标注的一个有特殊意义的字符串
      用以表达一定的含义 比如 $lt 表示小于

比较操作符

$eq 等于  =

e.g.
> db.class.find({age:{$eq:16}},{_id:0})
{ "name" : "Marry", "age" : 16, "sex" : "w" }

$lt 小于  <

* 字符串也可以比较大小

e.g. 年龄小于17的
> db.class.find({age:{$lt:17}},{_id:0})
{ "name" : "Marry", "age" : 16, "sex" : "w" }

$lte 小于等于  <=

$gt 大于 >

$gte 大于等于 >=

$ne 不等于 !=

* 如果某个文档不存在查找的域,则不等于可以匹配到该文档

$in 包含

e.g. 
db.class.find({age:{$in[12,13,14,15]}},{_id:0})

$nin 不包含

e.g.  年龄不是 12, 13
db.class.find({age:{$nin[12,13]}},{_id:0})

逻辑操作符

query 逗号分隔的条件即为与关系

e.g.年龄大于13 小于16
>db.class.find({age:{$gt:13,$it:16}},{_id:0})
e.g. 年龄大于13 且 性别为女
>db.class.find({age:{$gt:13},sex:'w'},{_id:0})


$and 逻辑与
e.g.年龄大于13 且 性别为女
db.class.find({$and:[{age:{$gt:13}},{sex:'w'}]},{_id:0})
e.g.年龄大于13 并且姓名大于Lily
db.class.find({$and:[{age:{$gt:13}},{name:{$lt:'Lucy'}}]},{_id:0})

$or 逻辑或

e.g. 年龄大于16或小于14
> db.class.find({$or:[{age:{$gt:16}},{age:{$lt:14}}]},{_id:0})

e.g.年龄大于15或姓别为男
db.class.find({$or:[{age:{$gt:15}},{sex:'m'}]},{_id:0})

$not 逻辑非

e.g. 年龄非大于15
db.class.find({age:{$not:{$gt:15}}},{_id:0})

$nor 既不也不

e.g. 既不大于16 也不是女生
db.class.find({$nor:[{age:{$gt:16}},{sex:'w'}]},{_id:0})

e.g. 年龄大于16且为男生      或者年龄小于14
db.class.find({$or:[{age:{$gt:16},sex:'m'},{age:{$lt:14}}]},{_id:0})


db.class3.insert({name:'小刚',age:9,sex:'m',score:[99,78,26]})
db.class3.insert({name:'小红',age:9,sex:'w',score:[90,78,56]})
db.class3.insert({name:'小明',age:8,sex:'m',score:[98,68,86]})

数组查找

查看数据中是否包含某一项

e.g. 如果score数组中包含78
db.class3.find({score:78},{_id:0})

$all
查找数据中同时包含多项

db.class3.find({score:{$all:[56,78]}},{_id:0})

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

db.class3.find({score:{$size:3}},{_id:0})

$slice
取出数组部分进行显示 放在field中

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

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

其他查找方法

$exists
判断一个域是否存在

e.g. 查找存在age域的文档
db.class3.find({age:{$exists:true}},{_id:0})

* true 表示有这个域 false表示筛选无这个域

$mod
余数查找

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

$type
找出值为指定类型的文档

e.g.  查找age数据类型为1的文档
db.class3.find({age:{$type:1}},{_id:0})

查找结果相关函数

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

e.g. 查找集合中age域值的范围
db.class3.distinct("age")
[ 9, 8 ]

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

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

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

e.g.  显示查找结果的前三条
db.class3.find({},{_id:0}).limit(3)

skip(n)
功能:跳过前n条显示

e.g.  跳过前三条显示
db.class3.find({},{_id:0}).skip(3)

count()
功能:计数统计

e.g.  统计男生数量
db.class3.find({sex:'m'},{_id:0}).count()

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

e.g. 按照年龄升序
db.class3.find({},{_id:0}).sort({age:1})

复合排序:当第一排序项相同时比较第二排序

e.g.
db.class3.find({},{_id:0}).sort({age:1,name:1})

函数的连续调用
当函数返回文档集合时还可以继续调用函数

e.g.  查找班级年龄最大的三个
db.class3.find({},{_id:0}).sort({age:1}).limit(3)

文档的删除操作

mysql:delete from table where ...

mongodb:db.collection.remove(query,justOne)

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

e.g. 删除姓名为‘小刚’的
db.class3.remove({name:"小刚"})

e.g. justOne为true则只删除第一条符合条件的
db.class3.remove({age:13},true)

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

练习:
1.创建数据库 名字 grade
2.数据库中创建集合 class
3.集合中插入文档,格式如下
  {name:'zhang',age:10,sex:'m',hobby:['a','b']}
  age范围 4-15
  hobby 范围 [draw dance sing pingpong basketball football running computer]

4.查找练习
    查看班级所有人信息
    查看班级年龄8岁的同学信息
    查看年龄大于10岁的学生信息
    查看年龄在8-11岁之间的学生信息
    查看年龄为9岁且为男生的学生
    找到年龄小于7岁或大于12岁的学生
    找到年龄为8岁或者11岁的学生
    找到有两项兴趣爱好的学生
    找到兴趣中有draw的学生
    找喜欢画画又喜欢跳舞的学生
    统计兴趣有三项的学生人数
    找到本班年龄第二大的同学
    查看兴趣的范围
    找到年龄最小的三个同学

5.删除所有年龄大于12或者小于7岁的同学

use grade
db.createCollection("class")
db.class.insert([{name:'zhao',age:10,sex:'m',hobby:['draw','dance']},
{name:'qian',age:8,sex:'m',hobby:['sing','dance','pingpong']},
{name:'sun',age:6,sex:'w',hobby:['draw','dance','basketball','computer']},
{name:'li',age:10,sex:'m',hobby:['draw','football','computer']},
{name:'zhou',age:7,sex:'w',hobby:['draw','running','computer','sing']},
{name:'wu',age:8,sex:'m',hobby:['draw','running','basketball','sing']},
{name:'zhen',age:8,sex:'w',hobby:['computer','sing']},
{name:'wang',age:9,sex:'w',hobby:['draw','running','computer','sing']},
{name:'xie',age:12,sex:'m',hobby:['running','computer','sing','computer']},
{name:'huang',age:13,sex:'m',hobby:['draw','computer','sing','football']}])

db.class.find()
db.class.find({age:8},{_id:0})
db.class.find({age:{$gt:10}},{_id:0})
db.class.find({age:{$gt:8,$lt:11}},{_id:0})
db.class.find({age:9,sex:'m'}},{_id:0})
db.class.find({$or:[{age:{$lt:7}},{age:{$gt:12}}]},{_id:0})
db.class.find({age:{$in:[8,11]}},{_id:0})
db.class.find({hobby:{$size:2}},{_id:0})
db.class.find({hobby:'draw'},{_id:0})
db.class.find({hobby:{$all:['draw','dance']}},{_id:0})
db.class.find({hobby:{size:3}},{_id:0})
db.class.find({},{_id:0}).sort({age:-1}).skip(1).limit(1)
db.class.distinct('hobby')
db.class.find({},{_id:0}).sort({age:1}).limit(3)

db.class.remove({$or:[{age:{$gt:12}},{age:{$lt:7}}]})

修改操作
mysql: update table set ... where ...
mongodb: db.collection.update(query,update,upsert,multi)
功能: 修改文档
参数: query: 筛选需要修改的文档,相当于where
             用法同查找
      update: 要修改什么内容 相当于set,往往需要配合修改操作符
      upsert: bool值 默认false 如果query的文档不存在则不做操作
                    设置为true 则如果文档不存在根据query和update内容插入新文档
      multi: bool值 默认false 如果筛选到多条文档则只修改第一条
                    设置为true则表示修改所有筛选到的文档

e.g.  年龄修改为18
db.class.update({name:"zhao"},{$set:{age:18}})

e.g. 如果没有'Jame'则插入一条新文档
db.class.update({name:"Jame"},{$set:{age:18}},true)

e.g.  修改所有女的 姓名改为小芳
db.class.update({sex:'w'},{$set:{name:'小芳'}},false,true)

作业:1.操作一遍增删改查已经解除的操作符
     2.学习一下魔法方法 __call__
     3.网络程序

猜你喜欢

转载自blog.csdn.net/zh__quan/article/details/81141688
今日推荐