[MongoDB] MongoDB 基础

介绍
---------
开源文档数据库, 高性能,高可用及伸缩性

文档数据库 Document Database
-------------------------------
1 文档的数据结构JSON格式(由键-值对组成,值可以是另外一个文档)
2 传统数据库的一条记录相当一个文档
3 文档必须小于 16MB

高性能
-------------
1 支持嵌入文档减少连接操作, 减少IO活动
2 支持更快的索引查询(B树索引)

高可用
-------------
1 提供复制工具, 即副本集来自动故障转移, 数据冗余。

副本集
-------------
一组MongoDB服务器, 管理同一个数据集. 提供最终一致性读,低延迟,高吞吐量的部署。

自动伸缩性
-------------
核心的功能支持水平扩展 - 集群
自动跨集群的分片及分发数据(sharding key)


名词
-----------
database                    数据库
collection                  集合(表)
document                    文档(表记录)
index                       索引
sharding                    分片
namespace                   命名空间(数据库.集合)
bson                        二进制JSON
driver                      驱动
replication                 复制(主 - 备 - 从结构, 从主复制到备与从节点,按语句数量达到一个特定值触发,通过 oplog 日志复制, 复制是异步的,通常与主节点相差 ms 级.)
memory-mapped file          内存映射文件(BSON数据直接加载到内存,不需要转换成对象.mongodb 直接操作内存)
view                        视图
work set                    索引的子集
replica set                    副本集
data model                  数据模型(优化: 使用引用(关联)而不是嵌套文档降低数据增长, 数据增长影响性能; 使用索引; 调整小集合大小; 调整内核参数;

使用
-----------
1 连接数据库
shell> mongo
>db
>show dbs
>use mydb
>db.user.insert( {name: 'bisoft', age: 20} )
>db.user.insert( {name: 'amos_tl', age: 29} )
>show collections
>db.user.find()
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "bisoft", "age" : 20 }
{ "_id" : ObjectId("4c2209fef3924d31102bd84b"), "name" : "amos_tl, "age" : 30 }
>db.user.findOne()
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "bisoft", "age" : 20 }
>db.user.find().limit(1)


_id 字段表示对象的ID(Object ID), 是惟一的.

游标(cursor)
------------
var c = db.user.find() // 返回一个游标
while ( c.hasNext() ) printjson( c.next() ) // 遍历游标
printjson( c [ 4 ] ) // 游标.toArray() - 隐式转换, 此方法会将游标的全部文档加载到内存,可能导致内存溢出
 


条件查询
db.user.find( { age : 20 } )
db.user.find( { age : {$gt: 25 }} )

//排序

db.user.find( { age : 20 } )
db.user.find( { age : {$gt: 25 } ).sort( {age : 1} )

// 分页
db.students.find().skip(pageNumber > 0 ? ((pageNumber-1)*pageSize) : 0).limit(pageSize)

// 投影
db.records.find( { "user_id": { $lt: 42 } }, { "name": 1, "email": 1 } )
返回包括 _id , name, email.
db.records.find( { "user_id": { $lt: 42} }, { "_id": 0, "name": 1 , "email": 1 } )
返回包括 name, email. 

// 聚集
db.user.count()
db.user.distinct()



集合(Collections)
--------------------
相当于表, 一组文档,共享索引.

BSON & JSON
----------------
BSON 表示二进制的 JSON.


CRUD
--------

// 更新,多行更新,默认只更新一个文档,加 multi: true, 表示更新所有行
db.users.update(
   { age: { $gt: 18 } },
   { multi: true }
)

// 没有文档可更新时,想要插入数据时,加upsert: true ,表示更新或插入.

// 删除所有
db.collection.remove({})

// 删除指定条件
db.inventory.remove( { type : "amos_tl" })

// 删除一条记录
db.inventory.remove( { name : "amos_tl" }, 1 )

// 保存替换
db.collection.save( { name: "test"} )



Write Concern 写关注(写操作只发生在主节点上)
保证写操作成功, 写关注级别:
unacknowledged         0
acknowledged           1             默认(保证所有写操作都是成功的)
                       >1            确保已经写到磁盘
majority 
w : 1

journaled: 确保已经写到磁盘; 数据先写到journaled日志,然后才异步写到磁盘. 这个日志类似重做日志. oplog 是操作日志, 用于复制.                      
j : true

wtimeout: 当w>1时,可以设置超时.
wtimeout : 100
<tag set>


备份与恢复
--------------------
使用 mongodump, mongoexport, mongoimport, mongorestore

集群
--------
主节点
mongod --master --dbpath /data/masterdb/ --oplogSize 1024M

从节点
mongod --slave --source <masterhostname><:<port>> --dbpath /data/slavedb/ --autoresync

local.sources 集合(表)
use local
db.sources.find()
db.sources.insert( { host: <masterhostname> <,only: databasename> } );

配置证书
keyFile = /srv/mongodb/keyfile
openssl rand -base64 741






猜你喜欢

转载自w26.iteye.com/blog/2153941