mongo(无关系型文档数据库)

第一天

MongoDB (芒果数据库)

数据存储阶段

文件管理阶段 (.txt  .doc  .xls)

优点 : 数据可以长期保存
        数据有一定格式化规范
                可以大量存储
                使用简单方便
缺点 :数据一致性差
       用户查找修改不方便
             数据冗余

数据库管理阶段

优点 : 数据组织结构化,降低了冗余
        提高了增删改查的效率
                便于扩展,方便程序调试做自动自动化处理
缺点 : 数据库的使用专业性较强,相对比较复杂

几个概念

数据 : 能够输入到计算机中并被识别处理的信息的集合
数据结构 :研究组成数据集合中数据之间关系的学科
数据库 : 按照数据结构,存储管理数据的仓库。
          是在数据管理系统软件管理和控制下创建在一定介质上的数据集合
数据管理系统 : 数据管理软件,用于维护管理数据库
数据库系统 : 由数据库,数据库管理系统,开发工具等组成的工具               集合

关系型数据库

采用关系模型来组织数据结构的数据库 (二维表)

Oracle   DB2   SQLServer   Mysql   Sqlite

优点 : 容易理解,逻辑类似常见的表格
        使用方便,都是用sql语句,sql语句非常成熟
                数据一致性高,冗余低,完整度号
                技术成熟,可以使用外部链接等复杂操作

缺点 : 每次操作都需要SQL语句解析,消耗较大
        不能很好的满足并发需求,应对海量数据爆发力不从心
                关系型数据库内存存在大量的加锁操作,读写能力受到限制
                数据不够灵活,有时会导致结构复杂化

非关系型数据库 (NoSql --》 not  only  sql)

优点 : 高并发,读写能力强
        扩展性强,使用灵活
                弱化了数据结构,降低数据一致性

缺点 : 通用性差,没有sql那样统一的操作语句
                操作灵活,容易混乱
                没有join等复杂操作,版本更新快

Nosql的使用情况
1. 数据的一致性要求低
2. 处理数据的海量并发
3. 数据库大小不容易确定,需要分布扩展
4. 给定的数据结构建立非关系模型更加容易

Nosql分类 : 

键值数据库   Redis
列存储数据库
文档数据库   MongoDB 
图形数据库

MongoDB数据库 (非关系型数据库 ---》 文档型数据库)

1. 由c++编写的数据库管理系统
2. 支持丰富的增删改查功能
3. 支持丰富的数据类型
4. 支持众多的编程语言结构 (python php  c++   js c#)
5. 在NoSql 中技术相对比较成熟

Mongodb 安装

自动安装
sudo apt-get install mongodb

默认安装路径 :  /var/lib/mongodb
配置文件 : /etc/mongodb.conf 
命令集 : /usr/bin   /usr/local/bin

whereis  软件名  : 查看一个软件的位置


手动安装

1. 下载合适版本的mongodb
www.mongodb.com  ---> get Mongodb  --> community  server 

2. 选择合适的位置解压 (/usr/local   /opt)
   解压后得到mongodb文件夹

3. 将文件夹下bin文件夹加入到环境变量
   (bin中就是命令集)
    
    PATH=$PATH:/opt/mongodb.../bin
    export PATH
    
    将以上两句写入 /etc/rc.local

4. 重启系统


Mongodb命令

设置数据库的存储位置 

mongod  --dbpath   目录

e.g.   mongod --dbpath  dbs

设置数据库端口
mongod --port  8080
* 默认27017

mongo  进入mongo shell

mongodb的交互模式,用于操作mongodb数据库
退出mongo shell  : quit() 或者  ctrl-c


mongodb数据库组成结构

组织结构 :  键值对 ---》 文档  ----》 集合  ---》 数据库

--------------------------
ID    |   name   |   age
--------------------------
1     |   Lily   |   17
--------------------------
2     |   Lucy   |   18
--------------------------

{
    "_id":1,
    "name":"Lily",
    "age":17
},
{
    "_id":2,
    "name":"Lucy",
    "age":18
}

概念对比

mysql  和  mongodb概念比较

mysql        mongodb      含义

database     database     数据库

table        collection   表/集合

column       field        字段/域  

row          document     记录/文档

index        index        索引


创建数据库

use   databaseName

e.g.  创建一个叫stu的数据库
      use  stu

* 实际use是选择使用哪个数据库,当选择的数据库不存在时就会自动   创建
* 只有向数据库中插入数据时数据库才会被真实创建出来,而use后不会马上创建


查看数据库
show dbs

系统数据库
admin  : 存放用户和权限
local :  存放本地化数据
config : 存储分片信息

数据库的命名规则
1. 使用utf-8字符
2. 不能含有空格   .   /   \   '\0' 字符
3. 长度不能超过64字节
4. 不能和系统数据库重名

* 习惯上使用小写字母,表达数据库的含义


db  : mongo系统全局变量,代表当前正在使用的数据库对象

* 当不使用use选择任何数据库的时候,db表示test。此时插入数据则   创建test数据库。


数据库的备份和恢复

备份   mongodump  -h  dbhost  -d   dbname  -o  dbdir

e.g.  将  127.0.0.1 上的 stu 数据库备份到bak目录中
mongodump -h 127.0.0.1 -d stu -o bak

恢复   mongorestore  -h host:port  -d  dbname  dbpath

e.g.  将stu数据库恢复到127.0.0.1上的student数据库中。如果          student数据库不存在则自动创建
mongorestore -h 127.0.0.1:27017  -d student  bak/stu


数据库的监测命令

mongostat

insert  query   update  delete : 每秒增删改查的次数
command   每秒运行命令的次数
flushes   每秒和磁盘交互次数
vsize   使用虚拟内存大小

mongotop  
监测每个数据读写时长

ns           total     read    write
数据集合    总时长    读时长   写时长


删除数据库
db.dropDatabase()
删除db所代表的数据库


创建集合 

db.createCollection(collection_name)

e.g. 创建一个叫class1的集合
db.createCollection('class1')

创建集合2

当向一个集合中插入数据的时候,如果这个集合不存在则自动创建

db.collection.insert(...)

e.g.  如果class2不存在则创建这个集合并插入数据
db.class2.insert({"name":"Lucy","age":18})

查看集合

show collections
show tables

集合的命名规则:
1.  合法的utf-8字符串
2.  不能有'\0'
3.  不能以 system. 开头。是系统的保留前缀
4.  不能和关键字重复

删除集合

db.collection.drop()

e.g.  删除class2集合
 db.class2.drop()


集合重命名

db.collection.renameCollection("new_name")

e.g.  将class 重命名为class0
 db.class.renameCollection("class0")


文档

mongodb中数据的组织形式 ---》 文档

mongodb文档 : 以键值对的形式组成的类似于字典的数据结构结合。
               是对数据的一种描述

键 : 即文档的域

命名规则
1. utf-8 格式字串
2. 不能有'\0'
3. 一个文档中的键不能重复

* 文档中键值对是有序的
* mongodb严格区分大小写

值 : 即文档存储数据,也就是mongodb支持的数据类型

bson  ---》json -----》 JavaScript

值类型             数值

整型               整数  1 2 3 -1 -3
布尔类型           true   false
浮点型             小数 1.234
Array              数组 [1,2,3]
Timestamp          时间戳
Date               时间日期
Object             内部文档
Null               空值  null
String             字符串
Symbol             特殊字符串
Binary data        二进制字符串
code               代码
regex              正则表达式
ObjectId           ObjectId对象


ObjectId

"_id" : ObjectId("5b764646d4ff0ad8f415f977")

_id : 如果在插入文档时没有指定_id域,则系统会自动添加该域作为       主键。值则是一个ObjectId类型数据

24 位 16进制数  --》 保证所有的_id值的唯一性

8位的 文档创建时间    6位  机器ID  4位 进程id   6位计数器


集合中的文档
* 集合中的文档不一定域的个数相同
* 集合中的文档不一定有相同的域
(关系型数据库: 表决定字段,mongodb中 文档决定域)


集合设计原则
1. 集合中的文档应该尽可能描述同一类内容。有更多相同的域
2. 同一类数据信息,不要过多分散集合存放
3. 集合中文档的层次不要包含太多


插入文档

db.collection.insert()

插入单个文档

e.g.
db.class0.insert({'name':"Lucy","age":18})
db.class0.insert({name:"Tom",age:17,sex:'m'})

*  查看插入结果 : db.class0.find()
*  文档中键可以不加引号
*  _id为系统自动添加主键,如果自己写也可以,但是不能重复


插入多条文档

db.collection.insert([{},{},{}])

e.g. 
db.class1.insert([{name:'阿宝',age:33,sex:'m'},{name:'阿蓉',age:27,sex:'w'},{name:'阿哲',age:32,sex:'m'}])

save 插入文档

db.collection.save()

e.g. 
db.class0.save({name:'Davil',age:16,sex:'m'})
db.class1.save([{name:'小白',age:30,sex:'w'},{name:'小陈',age:34,sex:'m'}])

* 如果不适用_id则save用法同insert一样
* 如果加_id项,此时文档已经存在时则会替换原有文档


获取集合对象
db.getCollection("collection")
===> db.collection

e.g.
db.getCollection("class1").insert({name:'老王',age:'36'})

查找操作

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({})

查找操作

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({})

修改操作符的使用

$set
修改一个域的值,增加一个域

e.g.  阿哲年龄修改为33
db.class1.update({name:'阿哲'},{$set:{age:33}})

e.g.  如果sex域不存在则会添加这个域
db.class1.update({name:'阿蓉'},{$set:{sex:'w'}})


$unset
删除一个域

e.g.  删除sex域
db.class1.update({name:'小陈'},{$unset:{sex:''}})

* 每个操作符可以同时操作多项
e.g.
db.class1.update({name:'陈'},{$set:{age:36,sex:'m'}})

* 一次修改可以同时使用多个操作符
e.g.
db.class1.update({name:'阿宝'},{$set:{name:'老王'},$unset:{sex:''}})

$rename
修改域名

e.g.  将sex域名改为gender
db.class1.update({sex:{$exists:true}},{$rename:{sex:'gender'}},false,true)

$setOnInsert
如果第三个参数为true且插入数据,则表示插入文档的补充内容。如果不插入文档则不起作用

e.g.  如果插入新文档则setOnInsert中键值对也作为文档内容
db.class1.update({name:'阿文'},{$set:{age:32},$setOnInsert:{gender:'m'}},true)

$inc
加减修改器

e.g.
db.class1.update({},{$inc:{age:-1}},false,true)

$mul
乘法修改器

e.g.
db.class2.update({},{$mul:{age:2}},false,true)

* $inc   $mul  参数可以使整数小数正数负数

$min 
如果筛选文档指定域的值小于min值则不修改,大于min值则修改为min值

e.g.  如果age大于18则修改为18
db.class2.update({},{$min:{age:18}},false,true)

$max
如果筛选文档指定域的值大于max值则不修改,小于max值则修改为max值

e.g.  将年龄不到30的修改为30
db.class1.update({},{$max:{age:30}},false,true)


数组修改器

$push   向数组中添加一项

e.g.  向score数组中添加一项
db.class2.update({name:'小亮'},{$push:{score:91}})

$pushAll  向数组中添加多项

db.class2.update({name:'小明'},{$pushAll:{score:[5,10]}})

$pull  从数组中删除一项

e.g.
db.class2.update({name:'小明'},{$pull:{score:10}})

$pullAll  从数组中删除多项

e.g. 
db.class2.update({name:'小明'},{$pullAll:{score:[58,5]}})


$each  对多个值进行逐一操作

e.g.
db.class2.update({name:'小明'},{$push:{score:{$each:[60,10]}}})


$position  指定插入位置

e.g.  配合each使用将数据插入到指定位置
 db.class2.update({name:'小红'},{$push:{score:{$each:[5],$position:1}}})

$sort  对数组进行排序

e.g.  对数组进行排序
db.class2.update({name:'小明'},{$push:{score:{$each:[],$sort:1}}})

$pop  弹出一项

e.g.   1表示弹出数组中最后一项,-1表示弹出第一项
db.class2.update({name:'小明'},{$pop:{score:-1}})

$addToSet  向数组中添加一项,但是不允许添加重复内容

e.g.  如果数组中没有80则添加80
db.class2.update({name:'小红'},{$addToSet:{score:80}})

时间类型

mongodb 中支持时间格式 : ISODate()

1. 使用new Date() 自动生成当前时间
e.g.
 db.class0.insert({book:'Python入门',date:new Date()})

2. 使用 ISODate() 生成当前时间
e.g. db.class0.insert({book:'Python精通',date:ISODate()})

3. 获取计算机时间生成时间格式字符串 Date()

db.class0.insert({book:'Python疯狂',date:Date()})

指定时间:

ISODate()
功能: 生成mongodb时间存储类型
参数: 不加参数生成当前时间
       指定时间格式参数:
       "2018-01-01 12:12:12"
       "20180101 12:12:12"
       "20180101"
e.g. 
db.class0.insert({book:'Python崩溃',date:ISODate("2018-07-13 11:23:36")})

时间戳

通过当前的时间生成的一个时间节点标志

valueOf()
生成某个标准时间的时间戳

e.g.
db.class0.insert({book:'Python重生',date:ISODate().valueOf()})


Null 类型

值 : null  

1. 如果某个域存在却没有值可以设置为null

e.g.  表示date没有实际意义的值
db.class0.insert({book:'Python编程',date:null})

2. 在查找时可以找到值为null或者不存在某个域的文档

e.g.  查找到date值为null或者不存在date域的文档
 db.class0.find({date:null},{_id:0})

数组的下标操作方式

可以通过  域名.下标  的方式具体操作数组的某一项

e.g.  查找数组 0 项大于90的文档
db.class2.find({'score.0':{$gt:90}},{_id:0})

e.g.  将score 第1项改为10
db.class2.update({name:'小红'},{$set:{'score.1':10}})


内部文档操作  Object

文档内部某个域的值还是一个文档,则这个文档称为内部文档类型数据

* 通过  外部域.内部文档域 的方式引用内部文档中某个域的值进行操作

e.g.
db.class3.find({'books.title':'狂人日记'},{_id:0})

e.g.
db.class3.update({"books.title":'骆驼祥子'},{$set:{"books.price":48.6}})


查找结果的下标引用

可以通过下标的方式获取查找结果的某一项

e.g.  获取查找结果的 第 2 项
db.class1.find({},{_id:0})[2]

猜你喜欢

转载自blog.csdn.net/gllvcpp/article/details/84196311