分类 mongodb 下的文章

一.官网下载 mongodb,解压到指定目录

本机mongodb目录为:/home/apps/mongodb/

二 .编写配置文件,主要指定数据库文件,日志文件,以及一些启动参数.

(1).在mongodb下新建data文件夹,以及子文件夹db,logs, 在logs中新建mongodb.log日志文件,其中db文件夹用来存储数据库文件,logs用来存储日志文件

(2).在mongodb/bin/目录下新建mongodb.conf配置文件,内容如下

dbpath=/home/apps/mongodb/data
logpath=/home/apps/mongodb/logs/mongodb.log
logappend=true
port=27018
fork=true
auth=true
logappend=true

 

dbpath:数据库文件路径

logpath:日志文件路径

logappend:是否追加日志

port:端口

fork:是否以后台进程启动

auth:是否启动授权认证

nohttpinterface:是否支持HTTP形式访问

三.编写自定义服务

(1).在/lib/systemd/system/目录下新建mongodb.service文件,内容如下

[Unit]

Description=mongodb 
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/home/apps/mongodb/data/bin/mongod --config /home/apps/mongodb/data/bin/mongodb.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/home/apps/mongodb/data/bin/mongod --shutdown --config /home/apps/mongodb/data/bin/mongodb.conf
PrivateTmp=true
  
[Install]
WantedBy=multi-user.target

 

(2).设置权限

chmod 754 mongodb.service

 

(3).启动关闭服务,设置开机启动

#启动服务
systemctl start mongodb.service  
#关闭服务  
systemctl stop mongodb.service  
#开机启动  
systemctl enable mongodb.service
#开机不启动  
systemctl disable mongodb.service

MongoDB 是一个基于分布式文件存储的数据库。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

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

技术贴—Mongodb解析

Mongodb特点

  • MongoDB的提供了一个面向文档存储,操作起来比较简单和容易。
  • 可以在MongoDB记录中设置任何属性的索引(如:FirstName="Sameer",Address="8Gandhi Road")来实现更快的排序。
  • 可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
  • 如果负载的增加(需要更多的存储空间和更强的处理能力),它可以分布在计算机网络中的其他节点上这就是所谓的分片。
  • Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
  • MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
  • Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
  • Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
  • Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
  • GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
  • MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
  • MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
  • MongoDB安装简单。

Mongodb应用场景

Mongodb现阶段已被许多大型网站应用,例如:淘宝,京东,github,ebay等。许多网站并非完全将传统的关系型数据库替换为mongodb,而是选择性的在部分模块应用。在应用mongodb之前,要根据自身需求以及mongodb的特点、不足进行选择。目前,mongodb适用于以下一些场景:

  • 网站数据:mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
  • 缓存:由于性能很高,mongo也适合作为信息基础设施的缓存层。在系统重启之后,由mongo搭建的持久化缓存可以避免下层的数据源过载。
  • 大尺寸、低价值的数据:使用传统的关系数据库存储一些数据时可能会比较贵,在此之前,很多程序员往往会选择传统的文件进行存储。
  • 高伸缩性的场景:mongo非常适合由数十或者数百台服务器组成的数据库。用于对象及JSON数据的存储:mongo的BSON数据格式非常适合文档格式化的存储及查询。

Mongodb优缺点

Mongodb相对关系型数据库有如下优点:

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

在满足以上优点的同时,却没有关系型数据库那样严格的事物支持,通常情况下,mongodb这一缺点阻碍了人们对其的选择。对于习惯利用关系型数据库的开发人员来说,mongodb没有关联查询,这也是在做数据库选型时会考虑到的。

在非关系型数据库中,mongdb拥有相对突出的优势,mongodb之所以是介于关系型数据库和非关系型数据库的产品,在于它提供了非常丰富的功能,例如MySQL中常用的数据增删改查,索引,聚合查询,分页这些功能,mongodb都提供了相应的能力,与hbase列存储相比,方便了数据的可操作性。

Mongodb适用项目

针对开发者在进行项目数据库选型时,根据mongodb的特点,优势,缺点综合考虑其适合性。例如在项目中进行的事务性操作比较多,那么mongodb就不是合适的选择。考虑到mongodb的数据存储结构比较灵活,并非固定结构,即扩展性高,那么在项目中经常出现需要扩展数据字段的情况,则可以选择mongodb。当然,项目中也可以利用不同的数据库,根据数据的性质选择存储的位置。

Mongodb概念

以下通过与MySQL对比介绍mongodb基本的术语:

技术贴—Mongodb解析

通过下图实例,我们也可以更直观的的了解Mongo中的一些概念:

技术贴—Mongodb解析

在mongodb中不存在表关联这一概念,但可以利用文档的内嵌达到数据的直接关联。

数据库

一个mongodb中可以建立多个数据库。 MongoDB的默认数据库为"db",该数据库存储在data目录中。 MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。

集合

集合就是MongoDB文档组,类似于RDBMS(关系数据库管理系统:RelationalDatabase Management System)中的表格。集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

文档

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

MongoDB 数据类型

下表为MongoDB中常用的几种数据类型。

技术贴—Mongodb解析

Mongodb通用指令

Mongodb的Linux安装比较简单,在安装完mongodb后,正常启动的情况下,进入应用的/bin目录下,执行命令./mongo便进入mongodb的后台管理shell,第一次进入shell时是默认选择test库。可通过exit或quit(),或trl+C退出shell。

Mongodb中常用的shell指令

技术贴—Mongodb解析

以上简单介绍指令的用法,详细说明可参考官方文档:https://docs.mongodb.com/manual/mongo/

在mongodb中创建索引时需要注意的事项:

  • 索引占据存储空间,存储在内存中,不能超过内存的限制,如果超过会自动删除索引,影响性能。
  • 集合中索引不能超过64个
  • 索引名的长度不能超过125个字符
  • 一个复合索引最多可以有31个字段

MongoDB GridFS

GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件,以下简单介绍gridFS的用途特点:

  • GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等)。
  • GridFS 也是文件存储的一种方式,但是它是存储在MonoDB的集合中。
  • GridFS 可以更好的存储大于16M的文件。
  • GridFS会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中。
  • GridFS 用两个集合来存储一个文件:fs.files与fs.chunks。
  • 每个文件的实际内容被存在chunks(二进制数据)中,和文件有关的meta数据(filename,content_type,还有用户自定义的属性)将会被存在files集合中。

fs.files 集合文档举例:

{

"filename": "test.txt",

"chunkSize": NumberInt(261120),

"uploadDate": ISODate("2014-04-13T11:32:33.557Z"),

"md5": "7b762939321e146569b07f72c62cca4f",

"length": NumberInt(646)

}

fs.chunks 集合文档举例:

{

"files_id": ObjectId("534a75d19f54bfec8a2fe44b"),

"n": NumberInt(0),

"data": "Mongo Binary Data"

}

详细说明可参考官方文档:https://docs.mongodb.com/manual/core/gridfs/

Mongodb的存储引擎

在mongodb3.0之前,存储引擎是MMAP,属于库级锁,所有数据库的集合文档,索引数据存入一个文件。

Mongodb3.0,推出了MMAPV1,wiredtiger 。

MMAPV1,适应于所有MongoDB版本,MongoDB3.0的默认引擎,属于集合级锁。相对于MMAP,并发性能有所提升,同时其空间预分配策略以2的N次方规则进行分配,优化了空间的利用。

Wiredtiger,在mongodb3.2作为默认的存储引擎,通过多版本并发控制完成文档级别锁,并发量提高;数据压缩率高于MMAPV1,由于数据压缩率高,占用内存及CPU也增高;wiredtiger通过定期数据快照操作和预写日志完成数据的一致性,同时可作为数据恢复的依据。

在mongodb3.2版本还推出了In-Memory存储引擎,其特点是数据存储于内存中,只将少量元数据和诊断日志存储到磁盘。

Mongodb的存储引擎类型可通过参数进行配置,开发者可根据几个存储引擎的特点结合实际需求进行选择。

http://www.toutiao.com/a6408415261343039746/

mongod -f /home/data/mongodb/mongodb.cnf 启动

mongo --port=27018 本地登录

db.auth("zrp","****"); 认证

db.zrpdb.insert({name:"111"}); 插入数据

mongodb版本为3.2(目前最新),演示的是linux下的mongodb授权认证

第一次登录不启动授权(mongo默认不启动)

 

./mongod --dbpath=/home/db/data --logpath=/home/db/logs/mongodb.log

 

接着使用 ./mongo 命令连接数据库

 ./mongo

 

切换到admin数据库 use admin

使用创建用户命令:

 

复制代码
use admin
db.createUser(
  {
    user: "coderhuang",
    pwd: "123456",
    roles: [ { role: "root", db: "admin" } ]
  }
)
复制代码

则对admin数据库添加了名为coderhuang的用户(注:mongo为每一个数据库都提供了一套用户权限)

接着关闭数据库(注:当启动了授权认证,只有root角色有权限可以关闭数据库)

db.shutdownServer();

 

第二次登录启用授权认证:

./mongod --auth --dbpath=/home/db/data --logpath=/home/db/logs/mongodb.log

接着切换到admin数据库,使用查看用户命令

use admin
show users

将提示未授权

这时需要做授权认证

db.auth("coderhuang","123456");

再调用刚才的命令则可以查看到用户信息

 

接着我们需要为我们的数据库添加相关用户,这里使用db_report为示例

复制代码
use db_report
db.createUser(
 {
   user: "client",
   pwd: "111111",
   roles: [
      { role: "readWrite", db: "db_report" }
   ]
 }
)
复制代码

这里为db_report数据库添加了具有读写权限的角色

 

 

到此,mongo授权完成

 

http://www.cnblogs.com/coderhuang/p/5180259.html

mongodb不支持事务,所以,在你的项目中应用时,要注意这点。无论什么设计,都不要要求mongodb保证数据的完整性。

但是mongodb提供了许多原子操作,比如文档的保存,修改,删除等,都是原子操作。

所谓原子操作就是要么这个文档保存到Mongodb,要么没有保存到Mongodb,不会出现查询到的文档没有保存完整的情况。


原子操作数据模型

考虑下面的例子,图书馆的书籍及结账信息。

实例说明了在一个相同的文档中如何确保嵌入字段关联原子操作(update:更新)的字段是同步的。

book= {_id: 123456789,title: "MongoDB: The Definitive Guide",author: [ "Kristina Chodorow", "Mike Dirolf" ],published_date: ISODate("2010-09-24"),pages: 216,language: "English",publisher_id: "oreilly",available: 3,checkout: [ { by: "joe",date: ISODate("2012-10-15") } ]
        }

你可以使用 db.collection.findAndModify() 方法来判断书籍是否可结算并更新新的结算信息。

在同一个文档中嵌入的 available 和 checkout 字段来确保这些字段是同步更新的:

db.books.findAndModify( {query: {_id: 123456789,available: {$gt: 0 }
          },update: {$inc: {available: -1 },$push: {checkout: { by: "abc",date: new Date() } }
           }
} )


原子操作常用命令

$set

用来指定一个键并更新键值,若键不存在并创建。

{$set: {field:value} }

$unset

用来删除一个键。

{$unset: {field: 1} }

$inc

$inc可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作。

{$inc: {field:value} }

$push

用法:

{$push: {field:value} }

把value追加到field里面去,field一定要是数组类型才行,如果field不存在,会新增一个数组类型加进去。

$pushAll

同$push,只是一次可以追加多个值到一个数组字段内。

{$pushAll: {field:value_array} }

$pull

从数组field内删除一个等于value值。

{$pull: {field:_value} }

$addToSet

增加一个值到数组内,而且只有当这个值不在数组内才增加。

$pop

删除数组的第一个或最后一个元素

{$pop: {field: 1 } }

$rename

修改字段名称

{$rename: {old_field_name:new_field_name} }

$bit

位操作,integer类型

{$bit: {field: {and : 5}}}

偏移操作符

>t.find() { "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] }
 
>t.update( {'comments.by':'joe'}, {$inc:{'comments.$.votes':1}}, false, true )
 
>t.find() { "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 4 }, { "by" : "jane", "votes" : 7 } ] }