MongoDB

MongoDB

简介
MongoDB是一个面向文档(document-oriented)的数据库,而不是关系型数据库。
不采用关系型主要是为了获得更好得扩展性。当然还有一些其他好处,与关系数据库相比,面向文档的数据库不再有“行“(row)的概念取而代之的是更为灵活的“文档”(document)模型。
通过在文档中嵌入文档和数组,面向文档的方法能够仅使用一条记录来表现复杂的层级关系,这与现代的面向对象语言的开发者对数据的看法一致。
另外,不再有预定义模式(predefined schema):文档的键(key)和值(value)不再是固定的类型和大小。由于没有固定的模式,根据需要添加或删除字段变得更容易了。通常由于开发者能够进行快速迭代,所以开发进程得以加快。而且,实验更容易进行。开发者能尝试大量的数据模型,从中选一个最好的。
易扩展
应用程序数据集的大小正在以不可思议的速度增长。随着可用带宽的增长和存储器价格的下降,即使是一个小规模的应用程序,需要存储的数据量也可能大的惊人,甚至超出
了很多数据库的处理能力。过去非常罕见的T级数据,现在已经是司空见惯了。
由于需要存储的数据量不断增长,开发者面临一个问题:应该如何扩展数据库,分为纵向扩展和横向扩展,纵向扩展是最省力的做法,但缺点是大型机一般都非常贵,而且
当数据量达到机器的物理极限时,花再多的钱也买不到更强的机器了,此时选择横向扩展更为合适,但横向扩展带来的另外一个问题就是需要管理的机器太多。
MongoDB的设计采用横向扩展。面向文档的数据模型使它能很容易地在多台服务器之间进行数据分割。MongoDB能够自动处理跨集群的数据和负载,自动重新分配文档,以及将
用户的请求路由到正确的机器上。这样,开发者能够集中精力编写应用程序,而不需要考虑如何扩展的问题。如果一个集群需要更大的容量,只需要向集群添加新服务器,MongoDB就会自动将现有的数据向新服务器传送
功能全
MongoDB作为一款通用型数据库,除了能够创建、读取、更新和删除数据之外,还提供了一系列不断扩展的独特功能

1、索引

支持通用二级索引,允许多种快速查询,且提供唯一索引、复合索引、地理空间索引、全文索引

2、聚合

支持聚合管道,用户能通过简单的片段创建复杂的集合,并通过数据库自动优化

3、特殊的集合类型

支持存在时间有限的集合,适用于那些将在某个时刻过期的数据,如会话session。类似地,MongoDB也支持固定大小的集合,用于保存近期数据,如日志

4、文件存储

支持一种非常易用的协议,用于存储大文件和文件元数据。MongoDB并不具备一些在关系型数据库中很普遍的功能,如链接join和复杂的多行事务。省略
这些的功能是处于架构上的考虑,或者说为了得到更好的扩展性,因为在分布式系统中这两个功能难以高效地实现
卓越的性能
MongoDB的一个主要目标是提供卓越的性能,这很大程度上决定了MongoDB的设计。MongoDB把尽可能多的内存用作缓存cache,视图为每次查询自动选择正确的索引。
总之各方面的设计都旨在保持它的高性能
虽然MongoDB非常强大并试图保留关系型数据库的很多特性,但它并不追求具备关系型数据库的所有功能。只要有可能,数据库服务器就会将处理逻辑交给客户端。这种精简方式的设计是MongoDB能够实现如此高性能的原因之一
重要概念
    mongoDB        mysql
    数据库         数据库
    集合             表
    文档(类似字典)   记录
    键值对          字段
创建账户
use admin 
db.createUser(
  {
    user: "root",
    pwd: "123",
    roles: [ { role: "root", db: "admin" } ]
  }
)

use test
db.createUser(
  {
    user: "jerry",
    pwd: "123",
    roles: [ { role: "readWrite", db: "test" },
             { role: "read", db: "db1" } ]
  }
)
开启账户认证
默认情况下mongodb不会加载认证信息就像mysql跳过授权表一样,创建完账号用户需要开启用户认证:
修改配置文件 /etc/mongodb.conf
bind_ip = 0.0.0.0
auth = true
# 重启mongodb 服务,启用认证
/etc/init.d/mongodb restart

# 登录方式1:  authenticationDatabase指定数据库
mongo --port 27017 -u "root" -p "123" --authenticationDatabase "admin"

# 登录方式2:进入mongo后
use admin
db.auth("root","123")

# 删除账号
db.dropUser('用户名');

# 修改密码
db.changeUserPassword(用户名, 新密码);
库的操作
# 创建数据库
use 数据库名称
#如果有则切换没有则创建新的,注意的是如果如果库中没有数据show dbs 中则不显示!

# 查看数据库
show dbs

# 删除
db.dropDatabase()
集合的操作
# 创建集合
db.user

# 查看集合
show collections
show tables

# 删除集合
db.user.drop()
文档操作
# 插入一条
db.user.insert({"_id":1})

# 插入多条
db.user.insertMany([
    {"_id":2,"name":"张三"},
    {"_id":3,"name":"李四"}
])

# 插入变量
var user1 = {"_id":4,"name":"王五"} # 定义一个变量 
db.user.insert(user1) # 直接插入一个变量

# 如果id已经存在则覆盖,没有则添加
db.user.save( {"_id":4,"name":"鹌鹑蛋"})
基本数据类型
mongoDB的语法就是js的语法,所以json支持的数据类型mongo都支持
# 案例
db.user.save({"_id":12,"a":"abcdefg","b":100,"c":1.1,"d":[1,2],
                "e":{"k1":"v1"},"f":true,"g":new Date(),"h":/^a.*c$/m})
db.user.find()
db.user.find().pretty() # 格式化查询结果
查询语句
# 查询所有
db.user.find()

# 条件查询
db.user.find({"name":"李四","_id":3})
 
# 比较运算符
>  <  !=  >=  <=
gt lt ne gte lte
db.user.find({"name":{"$ne":"张三"}})
db.user.find({"_id":{"$gt":3}})

# 逻辑运算符
and  or  not
db.user.find({"$or":[
   {"name":"张三"},
   {"name":"李四"}
]})

# 取反
db.user.find({"_id":{"$not":{"$mod":[2,1]}}})

# id在[1,2]内的
db.user.find({
    "_id":{"$in":[1,2]}
})

# id不在[1,2]内的
db.user.find({
    "_id":{"$nin":[1,2]}
})

# 查询指定字段 1表示展示  0不展示
db.user.find({},{"name":1,"_id":0})


db.student
db.student.insert({"_id":1,"name":"王同学","hobbies":["girl","play","music"]})
db.student.insert({"_id":2,"name":"张同学","hobbies":["play","music"]})
# 查询同时喜欢play和music的同学
db.student.find({"hobbies":{"$all":["play","music"]}})

# 查询王同学的第二个爱好
db.student.find({"hobbies.1":"play"})

# 查看所有人的第一个爱好
db.student.find({},{"hobbies":{"$slice":[0,1]}})

# 查看所有人的第二个爱好
db.student.find({},{"hobbies":{"$slice":[1,1]}})
修改语句
use test
db.stu.insert({"name":"aa","gender":"man","age":28,"hobbies":["read","music","dancing"]})
db.stu.insert({"name":"张翠山","gender":"man","age":28,"hobbies":["练剑","殷素素"]})
db.stu.insert({"name":"殷素素","gender":"woman","age":28,"hobbies":["练剑","张翠山"]})
db.stu.insert({"name":"张无忌","gender":"man","age":18,"hobbies":["中毒","赵敏"]})
db.stu.insert({"name":"赵敏","gender":"woman","age":18,"hobbies":["下毒","张无忌"]})
db.stu.insert({"name":"灭霸","gender":"man","age":280,"hobbies":["打架","装b"]})

# 使用$push操作符和$each修饰符一起添加多个值到数组字段中
db.stu.update({"name":"灭霸"},{"$push":{"hobbies":{"$each":[1,2,3,4]}}})

#从数组的尾部删除
db.stu.update({"name":"灭霸"},{"$pop":{"hobbies":1}})

# 把符合条件的删除
db.stu.update({"name":"灭霸"},{"$pull":{"hobbies":"打架"}})

# 避免添加重复
db.stu.update({"name":"灭霸"},{"$addToSet":{"likes":"喝农药"}})
# 避免添加重复
db.stu.update({"name":"灭霸"},{"$addToSet":{"likes":{"$each":["喝农药","喝农药","喝农药","喝农药1"]}}})

# $slice 只留最后n个
db.stu.update({"name":"aa"},{
    "$push":{"hobbies":{
        "$each":["read",'music','dancing'],
        "$slice":-1
    }
    }
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值