Mongodb - 01 概念+基础操作

分布式系统

分布式系统(distributed system)由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域 网)组成。
分布式系统是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。
因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。
分布式系统可以应用在在不同的平台上如:Pc、工作站、局域网和广域网上等。

Mongodb 的主要特点

1.MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
2.Mongodb 是一个面向文档的DBMS,数据存储在BSON格式中。这种格式是将相关数据都放置在一起,意味着所有的一切都放在一个位置。查询是基于文档中的键,因此这些文档可以分散到不同的服务器上。在高负载的情况下,添加更多的节点,可以保证服务器性能。
3.当Client端要将写入文档,使用查询等等操作时,需要将文档编码为BSON格式,然后再发送给Server端。同样,Server端的返回结果也是编码为BSON格式再放回给Client端的。
4.Mongodb 不支持Join,没有完全通用的事务,提供了辅助索引的支持。支持对文档级别的原子更新。
MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。相同集合中的文档可以有不同的字段。

MongoDB关键特性

 • Document-Oriented Storage
• Full Index Support
• Replication & High Availability
• Auto-Sharding
• Rich Querying
• Updates
• Map/Reduce
• GridFS

 

 

 

Mongodb 的安装

0.系统环境准备
$ cat /etc/hosts
172.16.9.201 dev_mongodb //不配置的话启动时会报错
1.解压安装包,配置路径
tar -zxvf mongodb-linux-x86_64-3.0.6.tgz
mv mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb
echo "export PATH=/usr/local/mongodb/bin:$PATH" >>/etc/profile
source /etc/profile
2.创建数据目录和用户
默认的数据目录是/data/db,也可以启动时使用--dbpath指定数据目录
mkdir -p /data/db
useradd mongodb
chown -R mongodb.mongodb /data/db
创建log目录
mkdir -p /data/log
3.启动Mongodb
./mongod --dbpath /data/db --logpath=/data/log/mongodb.log &
也可以指定配置文件启动
./mongod -f /etc/mongodb.conf
4.mongodb 的关闭
use admin;
db.shutdownServer()

 5.配置文件内容

  $ more mongod.conf 

  dbpath=/data/mongodb/db
  port=27017
  logpath=/data/mongodb/log/mongod.log
  fork=true

Mongodb 基本概念介绍

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

不同的数据库也放置在不同的文件中。
"show dbs" 命令可以显示所有数据的列表。
执行 "db" 命令可以显示当前数据库对象或集合。
$ ./mongo
MongoDB shell version: 3.0.6
connecting to: test
> db
test
>
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器
local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

文档
文档是一组键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
一个简单的文档例子如下:{"site":"www.runoob.com", "name":"菜鸟教程"}
需要注意的是:
1.文档中的键/值对是有序的。
2.文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至是整个嵌入的文档)。
3.MongoDB区分类型和大小写。
4.MongoDB的文档不能有重复的键。
5.文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

 

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

我们可以将以下不同数据结构的文档插入到集合中:
{"site":"www.baidu.com"}
{"site":"www.google.com","name":"Google"}
{"site":"www.runoob.com","name":"菜鸟教程","num":5}
● 集合名不能以"system."开头,这是为系统集合保留的前缀。
capped collections
Capped collections 就是固定大小的collection。
它有很高的性能以及队列过期的特性(过期按照插入的顺序). 有点和 "RRD" 概念类似。
Capped collections是高性能自动的维护对象的插入顺序。它非常适合类似记录日志的功能 和标准的collection不同,你必须要显式的创建一个capped collection,

指定一个collection的大小,单位是字节。collection的数据存储空间值提前分配的。
要注意的是指定的存储大小包含了数据库的头信息。
db.createCollection("mycoll", {capped:true, size:100000})
● 在capped collection中,你能添加新的对象。
● 能进行更新,然而,对象不会增加存储空间。如果增加,更新就会失败 。
● 数据库不允许进行删除。使用drop()方法删除collection所有的行。
● 注意: 删除之后,你必须显式的重新创建这个collection。

元数据
数据库的信息是存储在集合中。它们使用了系统的命名空间:
dbname.system.*
在MongoDB数据库中名字空间 <dbname>.system.* 是包含多种系统信息的特殊集合(Collection),如下:

对于修改系统集合中的对象有如下限制。
在{{system.indexes}}插入数据,可以创建索引。但除此之外该表信息是不可变的(特殊的drop index命令将自动更新相关信息)。
{{system.users}}是可修改的。 {{system.profile}}是可删除的。

 Mongodb 基本语法

use DATABASE_NAME:如果数据库不存在,则创建数据库,否则切换到指定数据库。

1.在louis 中创建一个louis 的collection

> db.louis.insert({"name":"Master"})

> db.hello.insert({"name":"blief"})

2.查看db 中有哪些collection

> show collections/show tables

hello

louis
3.删除一个 collection > db.hello.drop() true 4.删除一个数据库 > use louis; switched to db louis > db.dropDatabase() { "dropped" : "louis", "ok" : 1 } 5.向集合中插入一条文档db.COLLECTION_NAME.insert(document) > db.mongo.insert({"name":"Mongo 教程","by":"louis","date":"1109"}) WriteResult({ "nInserted" : 1 }) 6.查询各种操作 > db.mongo.find() { "_id" : ObjectId("5a03c5d78c6376a7dfc082ce"), "name" : "Mongo 教程", "by" : "louis", "date" : "1109" } { "_id" : ObjectId("5a03c67a8c6376a7dfc082cf"), "faith" : "keep", "vendor" : "louis" } > db.mongo.find().count() # 条件查询: or 后面的条件满足一个即可。 db.user.find({gender:'F',$or:[{country:'india'},{country:'America'}]}) # 只是使用选择器: repset:PRIMARY> db.hadoop.find({user_id:NumberLong(46456857)}) { "_id" : ObjectId("5a58671fedddd6a2cb2039d0"), "user_id" : NumberLong(46456857), "mac" : "CC", "use_time_length" : null } # 选择器和投影器一起使用 repset:PRIMARY> db.hadoop.find({user_id:NumberLong(46456857)},{mac:1,use_time_length:1}) 后面{} 中的内容就是投影器 { "_id" : ObjectId("5a58671fedddd6a2cb2039d0"), "mac" : "CC", "use_time_length" : null }

 db.students.find({'age':{$lt:25}})  # 年龄小于25

  db.students.find({'age':{$gt:25}})

  db.students.find({'class:{$in:['C1','C2']}})

# 排序 ( sort limit skip)

db.hadoop.find().sort({mac:-1})

db.hadoop.find().sort({mac:-1}).limit(10).skip(3)

# 使用游标查询

使用了find() 方法时,Mongo 会将查询结果作为一个游标对象返回。为了显示结果,mongo shell

会遍历所返回的游标。

var c = db.hadoop.find().sort({mac:-1}).limit(10)

while (c.hasNext()) printjson(c.netx())

或者 printjson(c[1])

# explain()

db.hadoop.find().sort({mac:-1}).limit(10).skip(3).explain('allPlansExecution') 

定义变量

> document=({"name":"菜鸟教程"})
{ "name" : "菜鸟教程" }
> db.mongo.insert(document)
WriteResult({ "nInserted" : 1 })
> db.mongo.find()
{ "_id" : ObjectId("5a03c5d78c6376a7dfc082ce"), "name" : "Mongo 教程", "by" : "louis"}
{ "_id" : ObjectId("5a03c67a8c6376a7dfc082cf"), "faith" : "keep", "vendor" : "louis" }
{ "_id" : ObjectId("5a03cada8c6376a7dfc082d0"), "name" : "菜鸟教程" }
插入文档你也可以使用 db.col.save(document) 命令。

 3.2 版本后还有以下几种语法可用于插入文档

 db.collection.insertOne():向指定集合中插入一条文档数据 

  db.collection.insertOne({"a": 3})

  db.collection.insertMany():向指定集合中插入多条文档数据

  db.collection.insertMany([{"b": 3}, {'c': 4}])

MongoDB 更新文档

MongoDB 使用 update() 和 save() 方法来更新集合中的文档。看下两个函数的应用及其区别。
1.update() 方法用于更新已存在的文档。语法格式如下:
db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } )
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的。
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。
> db.mongo.update({"name":"Mongo 教程"},{$set:{"name":"Mongo"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

save() 方法

如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,会更新该 _id 的数据。
save() 方法通过传入的文档来替换已有文档。语法格式如下:
db.collection.save( <document>, { writeConcern: <document> } )
document : 文档数据。
writeConcern :可选,抛出异常的级别。
1.不指定id 字段==insert
> db.mongo.save({"tt":"kk"})

2.指定id 字段==update
> db.mongo.save({"_id" : ObjectId("5a03c5d78c6376a7dfc082ce"),"name":"replace"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.mongo.find()
{ "_id" : ObjectId("5a03c5d78c6376a7dfc082ce"), "name" : "replace" }
{ "_id" : ObjectId("5a03c67a8c6376a7dfc082cf"), "faith" : "keep", "vendor" : "louis" }
{ "_id" : ObjectId("5a03cada8c6376a7dfc082d0"), "name" : "菜鸟教程" }

# update() : 用于文档级别,有助于更新一个集合中的单个或者多个文档。
> db.test.update({"age":{$gt:10}},{$set:{"status":"xxx"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改多条符合条件的数据:方法一
> db.test.update({"age":{$gt:20}},{$set:{"status":"muiti"}},{multi:true})
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })

# 如果$set 字段不存在则将该字段加入到文档中。
db.col1.update({},{$set:{company:'babytree'}},{multi:true})

# 从文档中移除字段
db.col1.update({},{$unset:{company:''}},{multi:true})

修改多条数据的方法二:
> db.test_collection.insert( [
... {"name":"abc","age":"25","status":"zxc"},
... {"name":"dec","age":"19","status":"qwe"},
... {"name":"asd","age":"30","status":"nmn"},
... ] )
> db.test_collection.updateMany({"age":{$gt:"22"}},{$set:{"status":"hhh"}})
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }
•    WriteConcern.NONE:没有异常抛出
•    WriteConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常
•    WriteConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。
•    WriteConcern.MAJORITY: 抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。
•    WriteConcern.FSYNC_SAFE: 抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。
•    WriteConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。

 

 

 

 

 

 

posted @ 2018-03-28 23:05  Sin-是我的海  阅读(94)  评论(0)    收藏  举报