数据操作(重点)

数据库的核心——CRUD,增加和删除较为简单,查询和修改较复杂

查询

关系运算符

  • $gt 大于

  • $lt 小于

  • $gte 大于等于

  • $lte 小于等于

  • $eq | (key: value) 等于

  • $ne 不等于

先往数据库中添加一些数据

db.students.insert({'name':'张三','sex':'男','age':19,'score': 89,'address': '海淀区'})
db.students.insert({'name':'李四','sex':'女','age':20,'score': 100,'address': '朝阳区'})
db.students.insert({'name':'王五','sex':'男','age':22,'score': 50,'address': '西城区'})
db.students.insert({'name':'赵六','sex':'女','age':21,'score': 60,'address': '东城区'})
db.students.insert({'name':'孙七','sex':'男','age':19,'score': 70,'address': '海淀区'})
db.students.insert({'name':'王八','sex':'女','age':23,'score': 90,'address': '海淀区'})
db.students.insert({'name':'刘九','sex':'女','age':35,'score': 56,'address': '朝阳区'})
db.students.insert({'name':'钱十','sex':'男','age':27,'score': 89,'address': '海淀区'})

exp:

  1. 查询姓名是张三的学生信息

     db.students.find({name:’张三’}).pretty()
  2. 查询性别是男的学生信息

     db.students.find({sex:’男’}).pretty()
  3. 查询年龄大于19岁的学生

     db.students.find({age:{$gt:19}}).pretty()
  4. 查询成绩大于等于60分的学生

     db.students.find({score:{$gte:60}}).pretty()
  5. 查询姓名不是王五的信息

     db.students.find({name:{$ne:’王五’}}).pretty()

逻辑运算符

  • $and

  • $or

  • $not | $nor

exp:

  1. 查询年龄在19 ~ 22岁的学生信息

     db.students.find({age:{$gte:19,$lte:22}}).pretty()

逻辑运算中与连接是最容易的,只需要利用,分割多个条件即可

  1. 查询年龄小于20岁,或者成绩大于90分的学生信息

     db.students.find(
    {$or:
    [
    {age:{$lt:20}},
    {score:{$gt:90}}
    ]
    }).pretty()
  2. 查询年龄大于等于20岁,且成绩小于等于90分的学生信息

     db.students.find(
    {$and:
    [
    {age:{$gte:20}},
    {score:{$lte:90}}
    ]
    }).pretty()
  3. 查询年龄小于20岁的学生信息

     db.students.find({age:{$lt:20}}).pretty()
    db.students.find({age:{$not:{$gte:20}}}).pretty()

取模

$mod:[除数,余数]

exp: 查询年龄除以20余1的学生信息

db.students.find({age:{$mod:[20,1]}}).pretty()

范围查询

$in: 在范围之中

$nin: 不在范围之中

exp:

  1. 查询姓名是”张三“、”李四、”王五“的学生

     db.students.find({name: {$in:['张三','李四','王五']}}).pret ty()
  2. 查询姓名不是”张三“、”李四、”王五“的学生

     db.students.find({name: {$nin:['张三','李四','王五']}}).pretty()

数组查询

  • $all

  • $size

  • $slice

  • $elemMatch

首先在数据库中新增一些数据

    db.students.insert({name:'a',sex:'男',age:19,score:89,address:'海淀区',course:['语文','数学','英语','音乐','政治']})
db.students.insert({name:'b',sex:'男',age:19,score:89,address:'海淀区',course:['语文','数学']})
db.students.insert({name:'c',sex:'男',age:19,score:89,address:'海淀区',course:['语文','数学','英语']})
db.students.insert({name:'d',sex:'男',age:19,score:89,address:'海淀区',course:['英语','音乐','政治']})
db.students.insert({name:'e',sex:'男',age:19,score:89,address:'海淀区',course:['语文','政治']})

$all: 表示全都包括,用法:

    {$all:[内容1,内容2]}

exp:

查询同时参加语文和数学的学生

    db.students.find({course:{$all:['语文','数学']}}).pretty()

数组的操作,可以利用索引,使用key.index的方式来定义索引

查询数组中第二个内容是数学的学生(sh)

    db.students.find({'course.1':'数学'}).pretty()

$size: 控制数组元素数量

exp:

查询只有两门课程的学生

    db.students.find({course:{$size: 2}}).pretty()

$slice: 控制查询结果的返回数量

exp:

查询年龄是19岁的学生,要求之显示两门参加的课程

    db.students.find({age:19},{course:{$slice:2}}).pretty()

此时查询返回的是前两门课程,可以设置参数来取出想要的内容

    $slice:-2   //后两门
$slice: [1,2] // 第一个参数表示跳过的数据量,第二个参数表示返回的数据量

嵌套集合运算

对象里面套对象

在数据库中新增数据

    db.students.insert(
{
name:'A',sex:'男',age:19,score:89,address:'海淀区',
course:['语文','数学','英语','音乐','政治'],
parents:[
{name:'A(father)',age:50,job:'工人'},
{name:'A(mother)',age:50,job:'职员'}
]
})
db.students.insert(
{
name:'B',sex:'男',age:19,score:89,address:'海淀区',
course:['语文','数学'],
parents:[
{name:'B(father)',age:50,job:'处长'},
{name:'B(mother)',age:50,job:'局长'}
]
})
db.students.insert(
{
name:'C',sex:'男',age:19,score:89,address:'海淀区',
course:['语文','数学','英语'],
parents:[
{name:'C(father)',age:50,job:'工人'},
{name:'C(mother)',age:50,job:'局长'}
]
})

对于嵌套的集合中数据的判断只能通过$elemMatch完成

语法:{ <field>: { $elemMatch: { <query1>, <query2>, ... } } }

exp:

查询父母中有人是局长的信息

    db.students.find({parents: {$elemMatch: {job: '局长'}}}).pretty()

判断某个字段是否存在

{$exists:flag} flag为true表示存在,false表示不存在

exp:

  1. 查询具有parents成员的学生

     db.students.find({parents:{$exists: true}}).pretty()
  2. 查询不具有course成员的学生

     db.students.find({course: {$exists: false}}).pretty()

排序

sort({ field: value }) value是1表示升序,-1表示降序

exp:

学生信息按照分数降序排列

    db.students.find().sort({score:-1}).pretty()

分页显示

skip(n): 跳过n条数据

limit(n): 返回n条数据

exp:

  1. 分页显示,第一页,每页显示5条数据

     db.students.find({}).skip(0).limit(5).pretty()
  2. 分页显示,第二页,每页显示5条数据

     db.students.find({}).skip(5).limit(5).pretty()

数据修改 | 更新

updateOne() 修改匹配的第一条数据

updateMany() 修改所有匹配的数据

格式:updateOne(<filter>,<update>)

修改器

$inc: 操作数字字段的数据内容

语法: {"$inc" : {成员 : 内容}}

exp:

将所有年龄为19岁的学生成绩一律减少30分,年龄增加1

    db.students.updateMany({age:19},{$inc:{score:-30,age:1}})

$set: 更新内容

语法:{$set: :{属性: 新内容}}

exp:

将20岁学生的成绩修改为89

    db.students.updateMany({age: 20},{$set: {score: 89}})

$unset: 删除某个属性及其内容

语法:{$unset: {属性: 1}}

exp:

删除张三的年龄和成绩信息

    db.students.updateOne({name:'张三'},{$unset: {age: 1,score: 1}})

$push: 向数组中添加数据

语法:{$push: {属性: value}}

exp:

在李四的课程中添加语文

    db.students.updateOne({name: '李四'},{$push: {course: '语文'}})

如果需要向数组中添加多个数据,则需要用到$each

exp:

在李四的课程中添加数学、英语

    db.students.updateOne(
{name:'李四'},
{$push:
{
course:{$each: ['数学','英语']}
}
}
)

$addToSet: 向数组里面添加一个新的数据

$push的区别,$push添加的数据可能是重复的,$addToSet只有这个数据不存在时才会添加(去重)

语法:{$addToSet: {属性:value}}

exp:

王五新增一门舞蹈课程

    db.students.updateOne(
{name:'王五'},
{$addToSet: {course:'舞蹈'}}
)

$pop: 删除数组内的数据

语法:{$pop: {field: value}},value为-1表示删除第一个,value为1表示删除最后一个

exp:

删除王五的第一个课程

    db.students.updateOne({name:'王五'},{$pop:{course:-1}})

只是删除属性的内容,属性还在

$pull: 从数组中删除一个指定内容的数据

语法:{$pull: {field:value}} 进行数据比对,如果是该数据则删除

exp:

删除李四的语文课程

    db.students.updateOne({name: '李四'},{$pull:{course:'语文'}})

$pullAll: 一次删除多个数据

语法:{$pullAll:{field:[value1,value2...]}}

exp:

删除a的语文数学英语课程

    db.students.updateOne({name:'a'},{$pullAll:{course:['语文','数学','英语']}})

$rename: 属性重命名

语法: {$rename: {旧属性名:新属性名}}

exp:

把张三的name属性名改为姓名

    db.students.updateOne({name:'张三'},{$rename:{name:'姓名'}})

mongodb学习(二)——基本的数据操作的更多相关文章

  1. MongoDB学习(三)数据导入导出及备份恢复

    这几天想着公司要用MongoDB,自然就要用到数据导入导出,就自己学习了一下. 在Mongo学习(二)中就讲到了在bin目录下有一些工具,本篇就是使用这些工具进行数据的导入导出及备份恢复. 注意:以下 ...

  2. MongoDB学习比较-07 C#驱动操作MongoDB

    下载驱动 驱动的下载有两种方式:一种是在C#项目中通过NuGet进行安装,另一种是通过下面的链接:https://github.com/mongodb/mongo-csharp-driver/rele ...

  3. mongodb学习(二)

    昨天给ubuntu13.04安装ati的显卡驱动,ubuntu本来对ati的显卡支持不是很好,没办法unity启动器没有了,ccsm也没有任何作用,只得重新安装了12.10,近期也不打算升级13.04 ...

  4. ballerina 学习二十九 数据库操作

    ballerina 数据操作也是比较方便的,官方也我们提供了数据操作的抽象,但是我们还是依赖数据库驱动的. 数据库驱动还是jdbc模式的 项目准备 项目结构 ├── mysql_demo │ ├── ...

  5. MongoDB学习【四】—pymongo操作mongodb数据库

    一.pymongodb的安装 Python 要连接 MongoDB 需要 MongoDB 驱动,这里我们使用 PyMongo 驱动来连接. pip安装 pip 是一个通用的 Python 包管理工具, ...

  6. MongoDB学习笔记~MongoVUE对数据进行查询,排序和按需显示

    回到目录 对于MongoDB这个非关系型数据库(NoSql)来说,找一个IDE工具不是很容易,还好被我找到了,它就是大名鼎鼎的MongoVUE,它可以对mongodb数据表进行增删改查,下面我主要说一 ...

  7. mongodb 学习二

    基本操作 增删改查实一个数据库必备的操作,接下来我们就说说怎么在shell下进行增删改查. 我们另外打开一个"命令指示符"窗口(注意:之前的不能关闭),输入mongo打开Mongo ...

  8. mongodb学习之:文档操作

    在上一章中有讲到文档的插入操作是用insert的方法.如果该集合不在该数据库中,mongodb会自动创建该集合并插入文档 用find的方法可以查找所有的集合数据 > db.maple.find( ...

  9. Mongodb for PHP教程之数据操作

    Mongodb的常用操作 参看手册,php官方的http://us2.php.net/manual/en/mongo.manual.php 也可以参看mongodb官方的教程 数据库连接 ⑴默认格式 ...

  10. mongodb学习(二)分级查询数组中的值

    (PS: 标题有点不妥当...) 大概是这样...数据结构如下: 需要模糊查询title的值... mongodb中操作语句: 主要是注意这里urlElements不需要加[0]...我开始的时候写成 ...

随机推荐

  1. 2018-6-11-WPF-Frame-的-DataContext-不能被-Page-继承

    title author date CreateTime categories WPF Frame 的 DataContext 不能被 Page 继承 lindexi 2018-06-11 10:48 ...

  2. iptables [match] 常用封包匹配参数

    参数 -p, --protocol 范例 iptables -A INPUT -p tcp 说明 匹配通讯协议类型是否相符,可以使用 ! 运算符进行反向匹配,例如: -p !tcp 意思是指除 tcp ...

  3. Python--day24--继承面试题

    输出:(打印的是Dog.func而不是Animal.func) __init__方法如果本生的类具有的话,父类的__init__方法就不在调用,没有才调用父类的__init__方法 派生属性: 如果既 ...

  4. laravel post提交数据时显示异常

    post提交数据时候显示如下: The page has expired due to inactivity. Please refresh and try again 这是由于在laravel框架中 ...

  5. Linux创建用户、设置密码、修改用户、删除用户命令

    与大家分享下Linux系统中创建用户.设置密码.修改用户.删除用户的命令,希望对你有所帮助. useradd testuser  创建用户testuserpasswd testuser  给已创建的用 ...

  6. 【React】富文本编辑器 清空文本内容 获取HTML

    富文本编辑器  React  传入 import React,{Component } from 'react'; import { Card, Button, Table, Form, Select ...

  7. Wannafly挑战赛15 C“出队”(约瑟夫环类问题)

    传送门 •参考资料 [1]:浅梦无痕 [2]:Esquecer [3]:My CSDN •题意 n 个人围成一圈,1,2 报数,报 1 的离队,求编号为 x 的第几次出队: •对博文[1]的理解 第一 ...

  8. C# 使用反射获取私有属性的方法

    本文告诉大家多个不同的方法使用反射获得私有属性,最后通过测试性能发现所有的方法的性能都差不多 在开始之前先添加一个测试的类 public class Foo { private string F { ...

  9. codeforces 1136E 线段树

    codeforces 1136E: 题意:给你一个长度为n的序列a和长度为n-1的序列k,序列a在任何时候都满足如下性质,a[i+1]>=ai+ki,如果更新后a[i+1]<ai+ki了, ...

  10. MyBatis 注解开发+逆向(Generator)

    注解开发 最初设计时,MyBatis 是一个 XML 驱动的框架.配置信息是基于 XML 的,而且映射语句也是定义在 XML 中的.随着技术的更新发展,对于开发效率要求也原来越高,特别是一些小型项目; ...