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:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。
浙公网安备 33010602011771号