mongodb的使用

 

一.NoSql

1.介绍

NoSQL(Not Only SQL ),意即“不仅仅是SQL” ,指的是非关系型的数据库 。是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
 
关系型数据库中的表都是存储一些结构化的数据,每条记录的字段的组成都一样,即使不是每条记录都需要所有的字段,但数据库会为每条数据分配所有的字段。而非关系型数据库以键值对(key-value)存储,它的结构不固定,每一条记录可以有不一样的键,每条记录可以根据需要增加一些自己的键值对,这样就不会局限于固定的结构,可以减少一些时间和空间的开销
 
    MongoDB 是一个高性能,开源,无模式的文档型数据库,是当前noSql数据库产品中最热门的一种。它在许多场景下用于替代传统的关系型数据库或键值对存储方式,MongoDB是用C++开发,MongoDB的官方网址为 http://www.mongodb.org/

2.NoSQL的优点/缺点

优点:

  • - 高可扩展性
  • - 分布式计算
  • - 低成本
  • - 架构的灵活性,半结构化数据
  • - 没有复杂的关系

缺点:

  • - 没有标准化
  • - 有限的查询功能(到目前为止)
  • - 最终一致是不直观的程序


二.什么是MongoDB?

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

在高负载的情况下,添加更多的节点,可以保证服务器性能。

MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

三.MongoDB的基础知识

1.介绍

在mongodb中基本的概念是文档、集合、数据库,下表是和关系型数据库的一些对比:

  • 文档:是MongoDB中数据的基本单元,非常类似于关系型数据库系统中的行(但是比行要复杂很多)
  • 集合:就是一组文档,如果说MongoDB中的文档类似于关系型数据库中的行,那么集合就如同表
  • MongoDB的单个计算机可以容纳多个独立的数据库,每一个数据库都有自己的集合和权限
  • MongoDB自带简洁但功能强大的JavaScript shell,这个工具对于管理MongoDB实例和操作数据库作用非常大
  • 每一个文档都有一个特殊的键"_id",它在文档所处的集合中是唯一的,相当于关系数据库中的表的主键


2.MongoDB的数据类型

 

2.数据库

一个mongodb中可以建立多个数据库。

MongoDB的默认数据库为"db",该数据库存储在data目录中。

MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。

在数据库操作中需要注意的地方有:

数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串:
#1、不能是空字符串("")。
#2、不得含有' '(空格)、.、$、/、\和\0 (空字符)。
#3、应全部小写。
#4、最多64字节。

有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
#1、admin: 从身份认证的角度讲,这是“root”数据库,如果将一个用户添加到admin数据库,这个用户将自动获得所有数据库的权限。再者,一些特定的服务器端命令也只能从admin数据库运行,如列出所有数据库或关闭服务器
#2、local: 这个数据库永远都不可以复制,且一台服务器上的所有本地集合都可以存储在这个数据库中
#3、config: MongoDB用于分片设置时,分片信息会存储在config数据库中

3.文档操作

文档是一组键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

例如一个简单的文档例子:

{"name":"xfm", "age":"18"}

下表列出了 RDBMS(关系型数据库) 与 MongoDB 对应的术语:

需要注意的地方有:

需要注意的是:
#1、文档中的键/值对是有序的。
#2、文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
#3、MongoDB区分类型和大小写。
#4、MongoDB的文档不能有重复的键。
#5、文档中的值可以是多种不同的数据类型,也可以是一个完整的内嵌文档。文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

文档键命名规范:
#1、键不能含有\0 (空字符)。这个字符用来表示键的结尾。
#2、.和$有特别的意义,只有在特定环境下才能使用。
#3、以下划线"_"开头的键是保留的(不是严格要求的)。

4.集合操作

集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。

集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

一个简单的例子:

{"site":"www.baidu.com","name":"百度"}
{"site":"www.google.com","name":"谷歌"}
{"site":"www.taobao.com","name":"淘宝"}
#1、集合存在于数据库中,通常情况下为了方便管理,不同格式和类型的数据应该插入到不同的集合,但其实集合没有固定的结构,这意味着我们完全可以把不同格式和类型的数据统统插入一个集合中。

#2、组织子集合的方式就是使用“.”,分隔不同命名空间的子集合。
比如一个具有博客功能的应用可能包含两个集合,分别是blog.posts和blog.authors,这是为了使组织结构更清晰,这里的blog集合(这个集合甚至不需要存在)跟它的两个子集合没有任何关系。
在MongoDB中,使用子集合来组织数据非常高效,值得推荐

#3、当第一个文档插入时,集合就会被创建。合法的集合名:
集合名不能是空字符串""。
集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
集合名不能以"system."开头,这是为系统集合保留的前缀。
用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。

 四.安装

1.安装

#1、安装路径为D:\MongoDB,将D:\MongoDB\bin目录加入环境变量

#2、新建目录与文件
D:\MongoDB\data\db
D:\MongoDB\log\mongod.log

#3、新建配置文件mongod.cfg
systemLog:
   destination: file
   path: "D:\MongoDB\log\mongod.log"
   logAppend: true
storage:
   journal:
      enabled: true
   dbPath: "D:\MongoDB\data\db"
net:
   bindIp: 0.0.0.0
   port: 27017
setParameter:
   enableLocalhostAuthBypass: false
    
#4、制作系统服务
mongod --config "D:\MongoDB\mongod.cfg" --bind_ip 0.0.0.0 --install
或者直接在命令行指定配置
mongod --bind_ip 0.0.0.0 --port 27017 --logpath D:\MongoDB\log\mongod.log --logappend --dbpath D:\MongoDB\data\db  --serviceName "MongoDB" --serviceDisplayName "MongoDB"  --install


#5、启动\关闭
net start MongoDB
net stop MongoDB

#6、登录
mongo
安装

 2.账号管理

#1、创建账号
use admin
db.createUser(
  {
    user: "root",
    pwd: "123",
    roles: [ { role: "root", db: "admin" } ]
  }
)

#在admin建立的用户一般都是管理员用户

use test
db.createUser(
  {
    user: "xfm",
    pwd: "123",
    roles: [ { role: "readWrite", db: "test" },
             { role: "read", db: "db1" } ]
  }
)

#2、重启数据库
mongod --remove
mongod --config "C:\mongodb\mongod.cfg" --bind_ip 0.0.0.0 --install --auth

#3、登录:注意使用双引号而非单引号
mongo --port 27017 -u "root" -p "123" --authenticationDatabase "admin"

#4.删除用户

#只用管理员用户才能删除用户
use test
switched to db test

> db.dropUser('xfm')
true  #结果

3.mongodb中所有角色以及对应的功能:

 五.MongoDB的增删改查

1.对库的操作

#1、增
use db1 #如果数据库不存在,则创建数据库,否则切换到指定数据库。

#2、查
show dbs #查看所有(如果数据库是空的,则不会显示出来,要插入一条数据后才会显示)

#例如:
db.t1.insert({'a':1})

#3、删
use t1 #先切换到要删的库下
db.dropDatabase() #删除当前库
对库的操作

2.对集合的操作

#1、增
当第一个文档插入时,集合就会被创建
> use db1
switched to db db1
> db.t1.insert({b:2})
WriteResult({ "nInserted" : 1 })
> db.t2.insert({b:3})
WriteResult({ "nInserted" : 1 })
#2、查
> show tables
t1
t2

#3、删
> db.t1.drop()
true
> show tables
t2
对集合的操作

3.对文档的操作

1.增加操作

#1、没有指定_id则默认ObjectId,_id不能重复,且在插入后不可变

#2、插入单条
user0={
    "name":"abc",
    "age":10,
    'hobbies':['music','read','dancing'],
    'addr':{
        'country':'China',
        'city':'BJ'
    }
}

#插入操作
db.test.insert(user0)

#查询
db.test.find()

#3、插入多条
user1={
    "_id":1,
    "name":"qwe",
    "age":10,
    'hobbies':['music','read','dancing'],
    'addr':{
        'country':'China',
        'city':'weifang'
    }
}

user2={
    "_id":2,
    "name":"wu",
    "age":20,
    'hobbies':['music','read','run'],
    'addr':{
        'country':'China',
        'city':'hebei'
    }
}


user3={
    "_id":3,
    "name":"asdf",
    "age":30,
    'hobbies':['music','drink'],
    'addr':{
        'country':'China',
        'city':'heibei'
    }
}

user4={
    "_id":4,
    "name":"ghj",
    "age":40,
    'hobbies':['music','read','dancing','tea'],
    'addr':{
        'country':'China',
        'city':'BJ'
    }
}

user5={
    "_id":5,
    "name":"jhjkl",
    "age":50,
    'hobbies':['music','read',],
    'addr':{
        'country':'China',
        'city':'henan'
    }
}

#插入多条数据
db.user.insertMany([user1,user2,user3,user4,user5])

#查询
db.test.find()
对文档的增加操作

 2.删除操作

#删除单个
db.userinfo.deleteOne({ 'is_sb': true }) #删除多个中的第一个

#删除后查询
db.userinfo.find()

#删除多个

#1.删除有相同内容的多个
db.userinfo.deleteMany( { 'x'': 1 } ) # 删除x=1的全部

#2.删除全部
db.userinfo.deleteMany({}) 

#删除后查询
db.userinfo.find().pretty()#查询结果一格式化想形式展开
删除操作

 3.修改操作

#做修改操作德时候,"_id"的值是不能发生变化的


#1.基本用法一:

#覆盖的修改(前面的括号内用来找到要被替换的内容(整条文档的替换),后面括号的是替换好文档的内容)

#例如:
> db.userinfo.find().pretty()
{ "_id" : 2, "is_nb" : false }
{ "_id" : 3, "is_nb" : false, "age" : 30 }
> db.userinfo.update({"age":30},{"is_nb":false,"age":60})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.userinfo.find().pretty()
{ "_id" : 2, "is_nb" : false }
{ "_id" : 3, "is_nb" : false, "age" : 60 }

用{ "_id" : 3, "is_nb" : false, "age" : 60 }覆盖原来的内容

#注意:{"age":30}如果有相同的话会不成功,最好使用"_id"来匹配

#2.另外一种

 

posted @ 2018-01-15 16:28  明-少  阅读(132)  评论(0)    收藏  举报