MongoDB简易教程mongo简介及应用场景安装和使用mongodbPHP中操作mongo数据库python中操作mongo数据库

传统数据库中,我们要操作数据库数据都要书写大量的sql语句,而且在进行无规则数据的存储时,传统关系型数据库建表时对不同字段的处理也显得有些乏力,mongo应运而生,而且ajax技术的广泛应用,json格式的广泛接受,也使得mongo更贴近开发人员。

mongo简介及应用场景

MongoDB是一个面向文档的非关系型数据库(NoSQL),使用json格式存储。Mongo DB很好的实现了面向对象的思想(OO思想),在Mongo DB中 每一条记录都是一个Document对象。Mongo DB最大的优势在于所有的数据持久操作都无需开发人员手动编写SQL语句,直接调用方法就可以轻松的实现CRUD操作。

mongo能应用在如下场景:

存储大尺寸、低价值的数据json及对象类型数据网站缓存数据评论、子评论类有明显从属关系数据多服务器数据,其内置的MapReduce很容易现实全局遍历。

主要功能特性:

  1. 文件存储格式BSON(一种json的扩展)
  2. 模式自由 数据格式不受限了表的结构
  3. 支持动态查询
  4. 支持完全索引
  5. 支持复制(其主从复制)和故障恢复
  6. 使用高效的二进制数据存储,包括大型对象
  7. 自动处理碎片,以支持云计算层次的扩展。
  8. 支持Java、Ruby、Python、C++、PHP等多种语言
  9. 内部支持Javascript

MongoDB的优势

1.查询速度快 2.高并发。可以达到2万个并发。 3.高容量。支持10TB意思的数据量 MongoDB

使用场景

1.网站数据 2.缓存 3.大尺寸、低价值的数据 4.高伸缩的场景 5.用于对象以及Json数据存储

mongoDB是介于nosql和sql之间的数据库。

NoSQL 数据库分类

类型

部分代表

特点

列存储

HbaseCassandraHypertable

顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。

文档存储

MongoDBCouchDB

文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有有机会对某些字段建立索引,实现关系数据库的某些功能。

key-value存储

Tokyo Cabinet / TyrantBerkeley DBMemcacheDBRedis

可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能)

图存储

Neo4JFlockDB

图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。

对象存储

db4oVersant

通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。

xml数据库

Berkeley DB XMLBaseX

高效的存储XML数据,并支持XML的内部查询语法,比如XQuery,Xpath。

MongoDB与其他数据库区别

对比项

MONGODB

MYSQL、ORACLE

数据库

数据库(dataBase)

数据库(dataBase,schema)

集合(collections)

二维表(table)

表中的一行数据

文档(document)

一行记录(record)

表字段

键(key)

列(column)

主外键

primary key,Forigen key

灵活度扩展项

极高

差(结构化数据)

安装和使用mongodb

我们在官网 https://www.mongodb.org/ 上可以下载到其最新稳定版本 ,mongo是官方已经编译好的,解压后即可使用其命令都在bin目录下。

使用前首先配置mongo.conf文件

port=xxxxx         //代表端口号,如果不指定则默认为 27017 
dbpath=/usr/local/mongodb/db    //数据库路径
logpath=/usr/local/mongodb/logs/mongodb.log //日志路径
logappend=true        //日志文件自动累加,而不是覆盖
fork=ture         //以守护进程方式创建

数据库和数据表都可以直接创建,即不用切换,直接使用,使用时即创建,mongo里还可以直接写js脚本,可直接运行,mongo中如果不指定_id字段,mongo会自动添加一个。

mongo的各种命令

mongo的命令是其精髓,这些十分复杂的命令集合在一块,使得mongo的查询变得绚丽而高效。mongo内的每个表称作一个collection(集合),使用命令类似于MySQL,切换到数据库内直接对每一个collection操作。其命令由方法(func())、查询体(写在{}里)和操作符(由$开头)组成。

基本命令

show dbs        //查看数据库
use dbname        //切换到数据库
db.createCollection('collection')  //创建数据表
db.collection.drop()     //删除数据表
db.dropDatabase()      //删数据库
db.collection.insert({data})   //插入数据
db.collection.find()     //显示数据表内全部内容

查询体

{key.attr.attr:value}          //普通式
{key:{$ne|$gt|$gte|$lt|$lte|$in|$nin|$all:value}}   //key满足 $oper value的值
{$or|$and|$not|$nor:[{key1:{$gt:value}},{key2:{$ne:value}}]} //用$oper同时限定key1,key2的条件
{key:{$mod{8,2}}}           //取出key对8取余为2的值。
{key:{$exist:1}}           //取出key列存在的值。
{key:{$type:String|Double|Array|Date|Object|Boolean|......}}//查询key类型为type的列
{key:{$regex:/pattern/}}         //通过正则查询,效率较低
{$where:'this.attr.express.....'}       //直接用where语句,二进制转为JS运算,较慢

find()方法增强

db.collection.find(query,{要取出的列:1,不需要的列:0})  
db.collection.find(query).skip(跳过的行数).limit(限制信息条数);
db.collection.find(query).explain()   //与MYSQL的解释语句一样。
db.collection.remove(query,[justone]) //如不指定query,全部删除;[justone]默认为false意思是查询到多个,但只删一个。

update语句

db.collection.update(query,{key:newvalue}) //注意:新值会覆盖旧值,即数据只剩下语句中定义的key
db.collection.update(query,
{
 $set:{key:newvalue},
 $unset:{key:value},
 $rename:{key:value},
 $inc:{key:value},
 ......
},
{
 multi:true,  //改变所有符合条件的,默认为false
 upsert:true  //没有的话刚添加,默认为false
}
)

游标

var cursorName=db.collection.fund(query,...)[.skip(num).limit(num)] //创建游标
cursorName.hasNext()            //判断是否有下一个
printjson(cursorName.next())          //输出游标的下一个指向值
cursorName.forEach(function(Obj){process Obj})      //遍历操作游标

索引

db.collection.getIndexes()     //查看索引
db.collection.ensureIndex({key:1/-1[,key.attr:1/-1]},{unique:1(是否唯一)},{sparse:1(是否非空)})// 添加正序/倒序索引
db.collection.dropIndex({key:1/2})   //删除索引
db.collection.reIndex()   //重建用了很多出现杂乱的索引

MapReduce

MapReduce是mongo中内置的一个非常强大的遍历操作工具,使用它需要实现它的map和reduce两个函数

db.runCommand(
 {
 mapReduce: collection,    //要操作的数据表
 map: function(){emit(key1,key2)}, //对key1和key2进行数据映射
 reduce: function(key,value){},  //对key值和数据组value进行操作
 out: <output>,
 query: <document>,
 sort: <document>,
 limit: <number>,
 finalize: <function>,
 scope: <document>,
 jsMode: <boolean>,
 verbose: <boolean>
 }
)

更多更详细的命令可以在mongo的中文社区 http://docs.mongoing.com/manual-zh/ 找到。

mongo的用户、数据导入导出和集群

用户管理

MongoDB默认不开启授权。可以在开启服务器时添加 --auth 或者 --keyFile 选项开启授权。使用配置文件的话,使用 security.authorization 或 security.keyFile 设置。

MongoDB提供 自带角色, 每一个角色都为一种常见用例提供一个明确的作用。例如 read, readWrite, dbAdmin, 和 root 等角色。我们通过创建用户,创建角色,给用户分配/回收不同的角色来进行用户管理。

添加角色时要先在admin数据库中添加一个管理员角色,然后使用管理员角色在每个库添加不同的角色。

use admin;(切换到admin数据库,对此库操作)
db.createUser(
 {
 user: "username",
 pwd: "password",
 roles:
 [
 {
 role: "userAdminAnyDatabase",
 db: "admin"
 }
 ]
 }
)
use database;
db.auth('username','passwd');用超级管理员用户登陆后,整个mongo数据库皆可存取。

数据导入导出

我们使用mongo自带的工具进行导入导出,在mongo/bin目录下,最好导出csv格式,便于数据交换。

./mongoexport -d dataname -c tablename -f key1,key2 -q 'query' -o ainname --csv
//导出数据,默认为json格式
./mongoimport -d dataname -c tablename --type json --file ./path 
//导入数据,默认为json格式

mongo数据库集群

  1. 打开mongod时添加选项 --replSet replname;
  2. 在mongo客户端连接上一个mongod进程,进入admin数据库,然后声明mongoconf变量:
use admin;
var rsconf={_id:'replname',members[{_id:0,host:'xxx'},{_id:1,host:'xxy'}]};
  1. 用rs.initiatee(rsconf);来初始化集群,mongo会自动将id号小的设为primary,其他的mongod进程为secondary。
  2. 连接secondary进程,使用slaveOk()函数,来初始化从进程。

PHP中操作mongo数据库

我们先为php添加mongo扩展。然后,我们便可以在脚本中使用mongo类函数库了。

不同于其他的类库只有一个核心类,mongo有四个类,分别是:

Mongo类,基础类,拥有连接、关闭连接、对全局数据库的操作方法。mongoDB类,由Mongo类通过selectDB()方法得到,拥有表级的操作方法。MongoCollection类,一般由Mongo->dbname->collection或直接用MongoDB类和数据库名实例化得到,拥有对数据的基本操作。MongoCursor类,由MongoCollection通过find()方法得到,拥有普通的游标遍历操作。

以下是一个典型的mongo操作:

$mongo=new Mongo();
$mongo->connect('host',port);
$collection=$mongo->dbname->collection;
$cursor=$collection->find();
$cursor->operate();
$mongo->close();

python中操作mongo数据库

安装

pip install pymongo

使用

In [1]: from pymongo import MongoClient
In [2]: m = MongoClient(host="127.0.0.1",port=27017)
In [3]: db = m.youdi
In [4]: col = youdi.col
In [7]: for i in col.find():
 ...:     print(i)

In [8]: dir(col)
Out[8]:
['_BaseObject__codec_options',
 '_BaseObject__read_concern',
 '_BaseObject__read_preference',
 '_BaseObject__write_concern',
 '_Collection__create',
 '_Collection__create_index',
 '_Collection__database',
 '_Collection__find_and_modify',
 '_Collection__full_name',
 '_Collection__name',
 '_Collection__write_response_codec_options',
 '__call__',
 '__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattr__',
 '__getattribute__',
 '__getitem__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__iter__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__next__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 '_aggregate',
 '_command',
 '_count',
 '_delete',
 '_delete_retryable',
 '_insert',
 '_insert_one',
 '_legacy_write',
 '_socket_for_primary_reads',
 '_socket_for_reads',
 '_socket_for_writes',
 '_update',
 '_update_retryable',
 'aggregate',
 'aggregate_raw_batches',
 'bulk_write',
 'codec_options',
 'count',
 'create_index',
 'create_indexes',
 'database',
 'delete_many',
 'delete_one',
 'distinct',
 'drop',
 'drop_index',
 'drop_indexes',
 'ensure_index',
 'find',
 'find_and_modify',
 'find_one',
 'find_one_and_delete',
 'find_one_and_replace',
 'find_one_and_update',
 'find_raw_batches',
 'full_name',
 'group',
 'index_information',
 'initialize_ordered_bulk_op',
 'initialize_unordered_bulk_op',
 'inline_map_reduce',
 'insert',
 'insert_many',
 'insert_one',
 'list_indexes',
 'map_reduce',
 'name',
 'next',
 'options',
 'parallel_scan',
 'read_concern',
 'read_preference',
 'reindex',
 'remove',
 'rename',
 'replace_one',
 'save',
 'update',
 'update_many',
 'update_one',
 'watch',
 'with_options',
 'write_concern']

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏王亚昌的专栏

Linux进程同步机制-Futex

引子 在编译2.6内核的时候,你会在编译选项中看到[*] Enable futex support这一项,上网查,有的资料会告诉你"不选这个内核不一定能正确的运...

5381
来自专栏程序员的知识天地

使用 JS 实现一个本地数据库

前端很多时候还是需要保存一些数据的,这里的保存指的是长久的保存。以前的思想是把数据保存在 Cookie 中,或者将 key 保存在 Cookie 中,将其他数据...

2952
来自专栏PhpZendo

MongoDB 学习笔记

感谢 Karl Seguin 编写的 The Little MongoDB Book 这本 MongoDB 入门书。

1051
来自专栏Python攻城狮

十一假期即将结束 不如复习下Python基础

博客地址:https://ask.hellobi.com/blog/zhiji 欢迎大家来交流学习。

781
来自专栏Kevin-ZhangCG

[ Java面试题 ]持久层篇

2626
来自专栏别先生

基于jsp+servlet图书管理系统之后台用户信息插入操作

前奏:   刚开始接触博客园写博客,就是写写平时学的基础知识,慢慢发现大神写的博客思路很清晰,知识很丰富,非常又价值,反思自己写的,顿时感觉非常low,有相当长...

3036
来自专栏ChaMd5安全团队

360春秋杯3道web题的简单分析

360春秋杯3道web题的简单分析 From ChaMd5安全团队核心成员 pcat&香香 where is my cat 这题一开始很坑的,存在着/.git/...

4438
来自专栏orientlu

FreeRTOS 任务调度 任务切换

前面文章 < FreeRTOS 任务调度 任务创建 > 介绍了 FreeRTOS 中如何创建任务以及其具体实现。 一般来说, 我们会在程序开始先创建若干个任务...

5222
来自专栏lgp20151222

Vue生命周期-手动挂载理解

浏览器缓存,试了下确实一定概率可以显示,但是,哪怕浏览器不行,我们也只能从自己的代码里修改来配合它,兼容它。

991
来自专栏Jimoer

Java设计模式学习记录-状态模式

状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题。状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象...

1131

扫码关注云+社区