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,將數據插入數據表