MongoDB-基础篇章

1.NoSQL和MongoDB简介

关系和非关系型数据库选择

  • 数据库事务准确性:关系型>非关系型
  • 速度:关系型<非关系型

数据模型

  • 范式化数据:子文档存在于另一个集合中;反范式化数据:文档包含子文档。
  • 固定集合:大小限制,保留最新文档。超过大小时先删除最旧的文档,再插入新文档。
  • 原子写入操作,反范式化文档的写入是原子性的,范式化文档可能不是。
  • 索引:_id字段自动创建。
  • 分片:拆分大型数据集合,放到多个MongoDB服务器中。
  • 复制:将数据复制到多个MongoDB服务器中。
  • 大型集合影响性能;而大量集合即大量的表,不会严重影响性能。
  • 数据的生命周期设置。

2.安装和配置MongoDB

搭建MongoDB环境

启动MongoDB

mongod

配置文件格式: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

Database

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()

创建集合

删除集合

  • collection_name.drop()

6 & 7.在MongoDB集合中查找文档

Cursor对象

Cursor对象相当于一个指针,可通过迭代它来访问数据库中的一组对象。

query参数

query参数是标准的js对象

从集合中获取文档

  • find(query,projection):返回一个Cursor对象。
  • findOne(query,projection):返回与query匹配的第一个文档。
  • 参数说明
    1. query:指定查询条件。
    1. 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()返回情况

数据库更新运算符

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对象,从而动态地指定需要根据哪些键进行分组。

查询结果聚合

查询结果映射-归并

  • 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选项参考
    原文作者:jBookis
    原文地址: https://www.jianshu.com/p/66d99e1c6372
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞