A. MongoDB挑战传统数据库:非结构化数据库的迭新不容小觑
相比甲骨文中国在中国市场的裁员风波,同为数据库服务的MongoDB显得更为乐观。“MongoDB是中国开发者最喜欢用的一个数据库。”MongoDB全球渠道及亚太区销售高级副总裁Alan Chhabra带着一点自信和骄傲在媒体面前宣称。
中国企业的数字化转型正进入关键期,在打造开放、高效、灵活、共享的云计算基础设施的同时,数据库的更新换代也被提上了日程。
日前,非结构化数据库平台提供商MongoDB在上海举办用户大会,MongoDB全球渠道及亚太区销售高级副总裁Alan Chhabra接受了亿欧企业服务频道的采访, 并针对去年修改开源协议,在SSPL的不同许可机制下授权服务器软件的争议以及其他疑问作出回应。
数据库的本质是解决数据的存储和管理问题。 Alan Chhabra表示,对企业发展具有战略意义的数据库正在催生巨大的市场。
在这些潜力颇大的数据库中,市场上目前存在着的是关系型的传统数据库和以Mongo DB为代表的非关联式新型数据库。传统数据库比较典型的是甲骨文旗下的Oracle数据库、IBM推出的大数据平台Hadoop和Stream Computing、微软的sql Server、SAP以及EMC Greenplum。 他们的主要差别在于数据库的结构化和非结构化。
结构化的数据是指可以使用关系型数据库表示和存储,表现为二维形式的数据,存储和排列很有规律,这对查询和修改等操作很有帮助,但扩展性和灵活性欠佳。 非结构化数据库就是各种文档、图片、视频/音频等没有固定结构的数据,一般直接整体进行存储为二进制的数据格式。 目前涵盖分布式数据库、图数据库、流数据库、时空数据库和众包数据库等多个领域。
MongoDB是文档型的非结构化新型数据库,Alan Chhabra表示, 与传统数据库相比,更能满足用户数据存储量大、计算灵活的需求。“在某些客户某些案例上,我们已经取代了传统数据库,比如甲骨文。”
当前, 软件对于商业模式的改变、开发人员地位的提高,以及企业向云端迁移的趋势 都让数据服务公司的发展得到了助力。但从毕马威会计事务所对首席信息官的调查结果来看, 88%的首席信息官认为他们未能从数字化战略中充分获益;82%的首席信息官认为其所在机构在利用技术推动业务发展方面并非“卓有成效”。 也就是说, 大多数公司的数字化战略是以失败告终的。
在此背景下,更加灵活、性能更加强大的新型数据库在一些领域获得了试验田丰收,并且可以看到,随着客户数据需求的繁杂程度的日益增加,传统数据库也在自我革新,以迎头赶上数据浪潮的大变革。
MongoDB成立于2007年,2017年在纳斯达克上市。最初,MongoDB是一项面向技术爱好者的技术,如今已成为一项企业级的业务关键技术。通过不断开发数据库即服务(Database-as-a-Service)产品,积极拥抱云计算,MongoDB在过去十年里,为开发人员提供了处理数据的方法。正因如此,它也成了企业数字化转型战略的一个关键部分。
MongoDB提供的产品主要包括MongoDB云服务MongoDB Atlas、MongoDB Mobile、MongoDB企业版和MongoDB Stitch等十余个相关产品。Alan Chhabra表示,产品包括了 开源版、付费版和云版。
2018 年 10 月,MongoDB宣布其开源许可证将从GNU AGPLv3切换到SSPL,新许可证将适用于新版本的MongoDB Community Server以及打过补丁的旧版本,这一举动引发了行业热议。基于GNU AGPLv3协议,企业可以将MongoDB作为公共服务但这需要企业开源自己的软件或是获得MongoDB的商业授权,事实却是MongoDB发现许多企业正在违反协议“疯狂试探”甚至已经违反协议。 SSPL( Server Side Public License)顾名思义,要求使用者必须得到服务器端公共许可证,这一协议会进一步约束商业公司使用MongoDB服务。
Alan Chhabra向亿欧解释, SSPL 针对的是提供MongoDB托管服务的云服务厂商。 也就是说,如果不是云服务厂商,没有公然售卖MongoDB产品,而只是作为应用后台数据库来使用的话,那么无论你是电商、物联网、金融、社交、 游戏 、移动应用等等,一概都不会有任何影响。 “MongoDB的宗旨还是为了始终支持并保护创新开放。”
但此开源协议的修改明显带来了市场用户的“掉粉”,比如Linux 社区的接连“弃用”,以及AWS 、IBM、微软推出了兼容MongoDB的相关产品来服务用户。
数据库开源的商业变现与创新形成的矛盾,目前似乎还尚未找到解决方案。
Alan Chhabra在大会上也透露了MongoDB的未来计划, 即将基于智能运营数据平台和下一代基础架构、文化、方法论和安全,推动原有系统的现代化、数据即服务、云数据策略、业务敏捷性,进而帮助客户实现以数据驱动的数字化转型。
针对MongoDB在中国的发展情况, Alan Chhabra表示,公司将以创新立足,持续引领数据库技术发展潮流,与合作伙伴携手助力中国企业的数字化转型。
MongoDB北亚区副总裁苏玉龙认为:“中国是数据大国,而数据就是未来的石油。如何利用好数据,让数据石油助力中国企业腾飞是MongoDB希望在中国达成的事情。随着中国企业数字化转型逐渐走向深入,MongoDB数据库的价值得到不断释放。”
本文作者龚晨霞,微信Gcx847076575,欢迎关注企业服务和产业互联网的朋友加微信交流。
B. mongo php 操作 怎样更新一条数据
PHP操作MongoDB数据库的简单示例。
Mongodb的常用操作
参看手册,php官方的http://us2.php.net/manual/en/mongo.manual.php
也可以参看mongodb官方的教程。
一,Mognodb数据库连接
1)、默认格式
复制代码代码示例:
$m=newMongo();
//这里采用默认连接本机的27017端口,当然也可以连接远程主机如192.168.0.4:27017,如果端口是27017,端口可以省略。
2)、标准连接
$m=newMongo(“mongodb://${username}:${password}@localhost”);
实例:
复制代码代码示例:
$m=newMongo(“mongodb://127.0.0.1:27017/admin:admin”);
数据库的用户名和密码都是admin
数据库操作:
1)、插入数据:
复制代码代码示例:
<?php
//这里采用默认连接本机的27017端口,当然你也可以连接远程主机如192.168.0.4:27017
//如果端口是27017,端口可以省略
$m=newMongo("mongodb://127.0.0.1:27017/admin:admin");
//选择comedy数据库,如果以前没该数据库会自动创建,也可以用$m->selectDB("comedy");
$db=$m->comedy;
//选择comedy里面的collection集合,相当于RDBMS里面的表,也可以使用
$collection=$db->collection;
$db->selectCollection("collection");
/*********添加一个元素**************/
$obj=array("title"=>"php1","author"=>"BillWatterson");
//将$obj添加到$collection集合中
$collection->insert($obj);
/*********添加另一个元素**************/
$obj=array("title"=>"huaibei","online"=>true);
$collection->insert($obj);
//$query=array("title"=>"huaibei");
$query=array("_id"=>$obj['_id']);
$cursor=$collection->find($query);
//遍历所有集合中的文档
foreach($cursoras$obj){
echo$obj["title"]." ";
echo$obj["_id"]." ";
}
//断开MongoDB连接
$m->close();
2)、带条件的查询
查询title为huaibei的字段
1$query=array(”title”=>”huaibei”);
2$cursor=$collection->find($query);//在$collectio集合中查找满足$query的文档
常用的SQL转化为mongodb的条件
复制代码代码示例:
mysql:id=123
mongo:array(‘id’=>123)
mysql:namelink’%bar%’
mongo:array(‘name’=>newMongoRegex(‘/.*bar.*/i’))
mysql:whereid>10
mongo:array(‘id’=>array(‘$gt’=>10))
mysql:whereid>=10
mongo:array(‘id’=>array(‘$gte’=>10))
mysql:whereid<10
mongo:array(‘id’=>array(‘$lt’=>10))
mysql:whereid<=10
mongo:array(‘id’=>array(‘$lte’=>10))
mysql:whereid>1andid<10
mongo:array(‘id’=>array(‘$gt’=>1,’$lt’=>10))
mysql:whereid<>10
mongo:array(‘id’=>array(‘$ne’=>10))
mysql:whereidin(123)
mongo:array(‘id’=>array(‘$in’=>array(1,2,3)))
mysql:whereidnotin(123)
mongo:array(‘id’=>array(‘$nin’=>array(1,2,3)))
mysql:whereid=2orid=9
mongo:array(‘id’=>array(‘$or’=>array(array(‘id’=>2),array(‘id’=>9))))
mysql:orderbynameasc
mongo:array(‘sort’=>array(‘name’=>1))
mysql:orderbynamedesc
mongo:array(‘sort’=>array(‘name’=>-1))
mysql:limit0,2
mongo:array(‘limit’=>array(‘offset’=>0,’rows’=>2))
mysql:selectname,email
mongo:array(‘name’,'email’)
mysql:selectcount(name)
mongo:array(‘COUNT’)//注意:COUNT为大写
更详细的转换参考http://us2.php.net/manual/en/mongo.sqltomongo.php
注意事项:
查询时,每个Object插入时都会自动生成一个独特的_id,它相当于RDBMS中的主键,用于查询时非常方便(_id每一都不同,很像自动增加的id)
例如:
复制代码代码示例:
<?php
$param=array("name"=>"joe");
$collection->insert($param);
$joe=$collection->findOne(array("_id"=>$param['_id']));
print_R($joe);
$m->close();
返回结果:Array([_id]=>MongoIdObject([$id]=>4fd30e21870da83416000002)[name]=>joe)
更改字段值:
复制代码代码示例:
<?php
$sign=array("title"=>'php1');
$param=array("title"=>'php1','author'=>'test');
$joe=$collection->update($sign,$param);
删除一个数据库:
复制代码代码示例:
$m->dropDB(“comedy”);
列出所有可用数据库:
复制代码代码示例:
$m->listDBs();//无返回值
附,mongodb常用的数据库方法
MongoDB中有用的函数:
创建一个MongoDB对象
复制代码代码示例:
<?php
$mo=newMongo();
$db=newMongoDB($mo,’dbname’);//通过创建方式获得一个MongoDB对象
删除当前DB
复制代码代码示例:
<?php
$db=$mo->dbname;
$db->drop();
获得当前数据库名
复制代码代码示例:
<?php
$db=$mo->dbname;
$db->_tostring();
选择想要的collection:
复制代码代码示例:
A:
$mo=newMongo();
$coll=$mo->dbname->collname;//获得一个collection对象
B:
$db=$mo->selectDB(’dbname’);
$coll=$db->collname;
C:
$db=$mo->dbname;
$coll=$db->collname;
D:
$db=$mo->dbname;
$coll=$db->selectCollectoin(’collname’);//获得一个collection对象
插入数据(MongoCollection对象):
http://us.php.net/manual/en/mongocollection.insert.php
MongoCollection::insert(array$a,array$options)
array$a要插入的数组
array$options选项
safe是否返回操作结果信息
fsync是否直接插入到物理硬盘
例子:
复制代码代码示例:
$coll=$mo->db->foo;
$a=array(’a’=>’b’);
$options=array(’safe’=>true);
$rs=$coll->insert($a,$options);
$rs为一个array型的数组,包含操作信息
删除数据库中的记录(MongoCollection对象):
http://us.php.net/manual/en/mongocollection.remove.php
MongoCollection::remove(array$criteria,array$options)
array$criteria条件
array$options选项
safe是否返回操作结果
fsync是否是直接影响到物理硬盘
justOne是否只影响一条记录
例子:
复制代码代码示例:
$coll=$mo->db->coll;
$c=array(’a’=>1,’s’=>array(’$lt’=>100));
$options=array(’safe’=>true);
$rs=$coll->remove($c,$options);
$rs为一个array型的数组,包含操作信息
更新数据库中的记录(MongoCollection对象):
http://us.php.net/manual/en/mongocollection.update.php
MongoCollection::update(array$criceria,array$newobj,array$options)
array$criteria条件
array$newobj要更新的内容
array$options选项
safe是否返回操作结果
fsync是否是直接影响到物理硬盘
upsert是否没有匹配数据就添加一条新的
multiple是否影响所有符合条件的记录,默认只影响一条
例子:
复制代码代码示例:
$coll=$mo->db->coll;
$c=array(’a’=>1,’s’=>array(’$lt’=>100));
$newobj=array(’e’=>’f’,’x’=>’y’);
$options=array(’safe’=>true,’multiple’=>true);
$rs=$coll->remove($c,$newobj,$options);
$rs为一个array型的数组,包含操作信息
查询collection获得单条记录(MongoCollection类):
http://us.php.net/manual/en/mongocollection.findone.php
arrayMongoCollection::findOne(array$query,array$fields)
array$query条件
array$fields要获得的字段
例子:
复制代码代码示例:
$coll=$mo->db->coll;
$query=array(’s’=>array(’$lt’=>100));
$fields=array(’a’=>true,’b’=>true);
$rs=$coll->findOne($query,$fields);
如果有结果就返回一个array,如果没有结果就返回NULL
查询collection获得多条记录(MongoCollection类):
http://us.php.net/manual/en/mongocollection.find.php
MongoCursorMongoCollection::find(array$query,array$fields)
array$query条件
array$fields要获得的字段
例子:
复制代码代码示例:
$coll=$mo->db->coll;
$query=array(’s’=>array(’$lt’=>100));
$fields=array(’a’=>true,’b’=>true);
$cursor=$coll->find($query,$fields);
//排序
$cursor->sort(array(‘字段’=>-1));(-1倒序,1正序)
//跳过部分记录
$cursor->skip(100);跳过100行
//只显示部分记录
$cursor->limit(100);只显示100行
返回一个游标记录对象MongoCursor。
针对游标对象MongoCursor的操作(MongoCursor类):
http://us.php.net/manual/en/class.mongocursor.php
循环或结果记录:
复制代码代码示例:
$cursor=$coll->find($query,$fields);
while($cursor->hasNext()){
$r=$cursor->getNext();
var_mp($r);
}
或者
$cursor=$coll->find($query,$fields);
foreache($cursoras$k=>$v){
var_mp($v);
}
或者
$cursor=$coll->find($query,$fields);
$array=iterator_to_array($cursor);
C. linux下mongdb数据库怎样更新补丁
首先到下面的工具原料中的mongodb的官网下载对应你系统的安装包,拷贝到你的linux系统上面,如果有网络可以直接用wget下载 解压对应的安装包 命令如下: tar zxf mongodb-linux-i686-2.0.2.tgz 因为mongodb不需要像别的数据库那样繁琐的配置解压
D. 更新频繁的MongoDB数据库 有什么优化建议
更新频繁的并不是mongodb的优势,建议使用缓存数据库和mongodb搭配使用,更新频繁的数据使用缓存存储,一定时间再同步到mongodb中。
E. MongoDB 数据库
游戏服务器开发中,玩家的账号,背包,装备,物品,排名等数据都需要落地存储在数据库中。行业中主流的数据库当属mysql,优点是免费开源,从端游时代过渡过来的程序员,求稳保守的话大多数会选用mysql数据库做存储。但是游戏中要存储的数据表会经常改动,导致数据库的表会频繁更新改动表结构,如果游戏数据量达到千万级别,对所有的表刷新改动会是一项很恐怖的事情,期间如果再出错,运维跟开发人员估计全都GG。
为了应对方便扩展,提升读写速度,NoSQL数据库(非关系型数据库)诞生。在NoSQL中应用比较广泛的当属mongodb和redis,由于对开发者友好,方便快速开发迭代高可用复制集满足数据高可靠、服务高可用的需求,运维简单,故障自动切换可扩展分片集群海量数据存储被游戏服务器广泛应用。现在的项目《鹿鼎记》用redis做高速缓存角色列表信息数据。
F. 怎样让ThinkPHP更新MongoDB数据库时,只影响一个文档
怎样让ThinkPHP更新MongoDB数据库时,只影响一个文档
创建一个thinkphp 项目tp,如下图,其中index.php为入口文件,App为项目文件夹
在App/Conf下的config.php中,配置数据库连接
在数据库中创建表qq_game,add 写入(新增)数据到数据库,语法如下,返回值是插入数据的主键值ID
在App/Lib/Action下的IndexAction.class.php中,创建函数addGame,将数据插入数据表