1.NoSQL和MongoDB简介
- 文档是以二进制格JSON(BSON)对象的方式存储的,使用集合将数据编组,相当于表。文档表示单个实体的数据。
- 字段名不能是空格、句点(.)、美元符号($)。
- 文档最大不能超过16MB。
- 每种数据类型分配了1~255的证书ID号。
- MongoDB数据类型及其ID号和排序规则参考
- MongoDB手册内容
关系和非关系型数据库选择
- 数据库事务准确性:关系型>非关系型
- 速度:关系型<非关系型
数据模型
- 范式化数据:子文档存在于另一个集合中;反范式化数据:文档包含子文档。
- 固定集合:大小限制,保留最新文档。超过大小时先删除最旧的文档,再插入新文档。
- 原子写入操作,反范式化文档的写入是原子性的,范式化文档可能不是。
- 索引:
_id
字段自动创建。 - 分片:拆分大型数据集合,放到多个MongoDB服务器中。
- 复制:将数据复制到多个MongoDB服务器中。
- 大型集合影响性能;而大量集合即大量的表,不会严重影响性能。
- 数据的生命周期设置。
2.安装和配置MongoDB
搭建MongoDB环境
启动MongoDB
mongod
- -port 28008
- -dbpath /data/db
- –config|-f filename
- –logpath /data/log
- 配置参数参考
配置文件格式:key_Setting = value
停止MongoDB
use db_name
db.shutdownServer()
MongoDB shell
启动shell
mongo
shell命令
help <option>
- db
- collection
- cursor
user <database>
- 修改当前数据库句柄
show <option>
- dbs
- collections
- users
- profile:显示system.profile中时间超过1毫秒的条目
log [name]
- 显示内存中日志的最后一部分,默认为global
exit
shell原生方法和构造函数
shell脚本编程
- mongo db_name –eval js_expression
- load(js_filename)
- mongo js_filename
4.配置用户账户和访问控制
安装MongoDB时会自动创建admin数据库。
账户管理
创建用户
- use db_name
- db.addUser(word_options)
word_options
- user:用户名
- roles:用户角色数组
- pwd:(可选)用户密码
- userSource:(可选)数据库(和pwd互斥,二选一)
- otherDBRoles:(可选)
{db_name:roles,...}
- 数据库角色参考
列出用户
1.shell命令
- use db_name
- show users
集合查询
- use admin
- db.system.users.find():返回一个游标对象,需通过它获取所需的信息。
删除用户
- use db_name
- db.removeUser(user_name)
访问控制
创建用户管理员账户
创建用户时角色:userAdminAnyDatabase
启用身份验证
- 启动服务器时:mongod -auth
- 此时操作服务器便需要输入账户密码。
创建数据库管理员账户
创建用户时角色:readWriteAnyDatabase,dbAdminAnyDatabase,clusterAdmin
5.数据库和集合
对象
Connection
- getDB(db_name)
- Connection对象方法参考
Database
- getCollection(collection_name)
- Database对象方法参考
Collection
- count()
- Collection对象方法参考
数据库管理
显示数据库列表
- show dbs
切换数据库(句柄)
- use db_name
- db = db.getSiblingDB(db_name)
创建数据库
数据库是在添加集合或用户时隐式创建的。
- use db_name → 创建集合
- getDB(db_name) → 创建集合
删除数据库
- use db_name
- db.dropDatabase():删除当前数据库,但不会修改当前数据库句柄。若再创建集合,则数据库会重建。
集合管理
显示集合列表
- use db_name
- show collections
- db.getCollectionNames()
创建集合
- createCollection(collection_name,[options])
- options属性参考
删除集合
- collection_name.drop()
6 & 7.在MongoDB集合中查找文档
Cursor对象
Cursor对象相当于一个指针,可通过迭代它来访问数据库中的一组对象。
query参数
query参数是标准的js对象
从集合中获取文档
- find(query,projection):返回一个Cursor对象。
- findOne(query,projection):返回与query匹配的第一个文档。
- 参数说明
- query:指定查询条件。
- projection:指定返回字段。
- distinct(key,[query]):返回一个数组,包含指定key的不同值。
8.操作MongoDB文档
写入关注保障等级
等级越高,保障越高,响应效率越低。
写入关注等级
- -1:忽略网络错误。
- 0:不要求进行写入确认。
- 1:要求进行写入确认。
- 2:要求已写入到副本集的主服务器和一个备用服务器。
- majority:要求已写入到副本集中的大多数服务器。
配置数据库连接错误处理
- Database.runCommand(json);
Database.runCommand({ getLastError:1, w:1, j:true, wtimeout:1000 });
- 参数说明
- w:写入关注等级。
- wtimeout:1000,指定写入操作完成等待时长,单位毫秒。
- fsync:true-写入请求将等到fsync结束再返回。
- j:true-写入请求将等到日志同步完成后再返回。
获取数据库写入请求的状态
Database对象执行的最后一次请求返回的值,Database.getLastError()返回情况
- true:返回null。
- false:返回包含错误消息的字符串。
- getLastError返回的对象属性参考
数据库更新运算符
update对象格式
{<operator>:{<field_operation>,...},...
- update对象中的运算符参考
在集合中添加文档
- insert(docs)
在集合中更新文档
- update(query,update,upsert,multi)
- 参数说明
- query:匹配条件。
- update:修改内容。
- upsert:true-查询无匹配则插入新文档。
- multi:true-操作匹配的所有文档。
在集合中保存文档
- save(doc)
- 修改从MongoDB中检索的对象时使用,可无需指定query和update对象。
在集合中删除文档
- remove([query],[isOne])
- 无参数则删除集合中所有的文档。
- query:匹配条件。
- isOne:true-仅删除匹配的第一个文档。
9.分组、聚合和映射-归并
查询结果分组
group({key,reduce,initial,[keyf],[cond],finalize})
- 参数说明
- key:分组字段如
{key:{key1:1,key2:1}}
- cond:可选。匹配条件。
- initial:初始group
{key-value}
对象,用于分组期间聚合数据如计数器。- reduce:函数
function(obj,prev){}
,对于每个匹配的文档都执行此函数。obj为当前文档,prev是根据上述initial创建的对象,可用于根据obj来更新prev。- finalize:函数
function(obj){}
,对于每个键值组合匹配的最后一个文档执行reduce函数得到的。对于每个键值组合,都使用reduce函数得到的最终对象调用这个函数,然后返回结果数组。- keyf:可选。用于替代key,使用函数返回一个用于分组的key对象,从而动态地指定需要根据哪些键进行分组。
查询结果聚合
aggregate(operator1,operator2,...)
- 流水线式进行聚合运算符操作。该方法返回一个对象,该对象名为result的属性包含聚合结果的迭代器。版本2.6+直接返回包含聚合结果的迭代器。
- 访问聚合结果
results = collection.aggregate(...); results.result.forEarch(function(item){...})
- 版本2.6+
:results = collection.aggregate(...); results.forEarch(function(item){...})
- 聚合运算符参考
- 聚合运算符$group内:表达式运算符参考
- 聚合表达式内:字符串和算术运算符参考
查询结果映射-归并
mapReduce(map,reduce,arguments)
- 参数说明
- map(映射):一个函数
function(){emit(key,value)}
,将数据集中每一个文档执行它生成一个key-value
,这些value被加入到与key相关联的数组中,供归并阶段使用。- reduce(归并):一个函数
function(key,values){return result}
,对map生成的每个对象执行它,对values计算得到result返回。- arguments:一个对象(json),指定查询结果传递给map时使用的选项。
- arguments选项参考