《實戰(zhàn)Angular2/Mongodb/Node博客系統(tǒng)(二)》要點:
本文介紹了實戰(zhàn)Angular2/Mongodb/Node博客系統(tǒng)(二),希望對您有用。如果有疑問,可以聯(lián)系我們。
相關(guān)主題:非關(guān)系型數(shù)據(jù)庫
在開始正式講解本系統(tǒng)前,我們可能需要給大家準(zhǔn)備一些基本知識的儲備,本節(jié)我們將會給大家快速的補充一下本系統(tǒng)必須的MongoDB部分的知識點,具體包含以下內(nèi)容:
了解什么是MongoDB以及MongoDB的特性
掌握MongoDB最常見的用法
掌握MongoDB更高級的一些用法
MongoDB與Node的互操作
2.1、MongoDB簡介
官方定義:MongoDB 是一個基于分布式文件存儲的數(shù)據(jù)庫.由C++語言編寫.旨在為WEB應(yīng)用提供可擴展的高性能數(shù)據(jù)存儲辦理方案.MongoDB 是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的.他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json的bson格式,因此可以存儲比較復(fù)雜的數(shù)據(jù)類型.Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引.
通俗解釋: Mongo DB ,是目前在IT行業(yè)非常流行的一種非關(guān)系型數(shù)據(jù)庫(NoSql),其靈活的數(shù)據(jù)存儲方式,備受當(dāng)前IT從業(yè)人員的青睞.Mongo DB很好的實現(xiàn)了面向?qū)ο蟮乃枷?OO思想),在Mongo DB中 每一條記錄都是一個Document對象.Mongo DB最大的優(yōu)勢在于所有的數(shù)據(jù)持久操作都無需開發(fā)人員手動編寫SQL語句,直接調(diào)用辦法就可以輕松的實現(xiàn)CRUD操作.
特點
1、MongoDB是基于文檔的數(shù)據(jù)庫
2、是介于關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫之間的產(chǎn)品(最像關(guān)系性數(shù)據(jù)庫的NoSQL)
3、支持類似json的bson格式,數(shù)據(jù)結(jié)構(gòu)非常松散
官網(wǎng)地址:http://www.mongodb.org/ 百度百科:http://baike.baidu.com/subview/3385614/9338179.htm
2.2、MongoDB優(yōu)缺點
優(yōu)點: 弱一致性 文檔結(jié)構(gòu)的存儲方式 內(nèi)置GridFS(分布式文件系統(tǒng))
缺點: 不支持事務(wù) 空間占用大
2.3、主要適用場合
其主要場景如下:
1)網(wǎng)站實時數(shù)據(jù)處理.它非常適合實時的插入、更新與查詢,并具備網(wǎng)站實時數(shù)據(jù)存儲所需的復(fù)制及高度伸縮性.
2)緩存.由于性能很高,它適合作為信息基礎(chǔ)設(shè)施的緩存層.在系統(tǒng)重啟之后,由它搭建的持久化緩存層可以避免下層的數(shù)據(jù)源過載.
3)高伸縮性的場景.非常適合由數(shù)十或數(shù)百臺服務(wù)器組成的數(shù)據(jù)庫,它的路線圖中已經(jīng)包括對MapReduce引擎的內(nèi)置支持.
不適用的場景如下:
1)要求高度事務(wù)性的系統(tǒng).
2)傳統(tǒng)的商業(yè)智能應(yīng)用.
3)復(fù)雜的跨文檔(表)級聯(lián)查詢.
1)在官網(wǎng)直接下載安裝包,下載地址:http://www.mongodb.org/downloads
2)安裝非常的簡單只要,解壓或者安裝就可以.這取決于你下載的是msi安裝包
是zip壓縮包.
如果是zip的壓縮包.直接解壓,解壓后,放在D:/MongoDB目錄下.為了命令行的方便,可以把D:/MongoDB/bin加到系統(tǒng)環(huán)境變量的path中.
如果是msi安裝包.基本默認(rèn)安裝下一步下一步即可,注意你的安裝路徑.
3)測試是否安裝成功
D:\>mongod --dbpath D:/MongoDB/data
Sun Oct 24 15:07:05 MongoDB starting : pid=2472 port=27017
dbpath=D:/MongoDB/data 32-bit
** NOTE: This is a development version (1.7.1) of MongoDB.
....
Sun Oct 24 15:07:05 [websvr] web admin interface listening on port 28017
由于是開發(fā)版,上面就有個警告,沒關(guān)系,忽略它.
最后兩行說明的數(shù)據(jù)庫端口和Web端口,分別是27017和28017,在瀏覽器中打開http://localhost:27017,可以看到其相關(guān)的一些信息.
這樣說明安裝成功.
第一部分:MongoDB基礎(chǔ)
4.1、創(chuàng)建庫
use 命令
MongoDB use DATABASE_NAME 用于創(chuàng)建數(shù)據(jù)庫.該命令將創(chuàng)建一個新的數(shù)據(jù)庫,如果它不存在,否則將返回現(xiàn)有的數(shù)據(jù)庫.
語法:
use DATABASE 語句的基本語法如下:
use DATABASE_NAME
示例:
如果想創(chuàng)建一個數(shù)據(jù)庫名稱 <testDB>, 那么 use DATABASE 語句如下:
>use testDB
switched to db testDB
要檢查當(dāng)前選擇的數(shù)據(jù)庫使用命令 db
>db
testDB
PS:
前提1 - mongodb安裝在d:/mongodb目錄下
前提2 - 已經(jīng)將d:/mongdb/bin配置在windows環(huán)境變量的path路徑中
前提3 – 在d:/mongodb/目錄下新建一data文件夾
前提4 – 運行cmd命令,在命令行中健入如下命令:
> mongod --dbpath D:/MongoDB/data
運行如下圖所示:
說明mongodb服務(wù)器啟動在:127.0.0.1:385979端口處監(jiān)聽哀求!
重新打開一新的控制臺:
并健入如下命令:mongo
用于連結(jié)服務(wù)器,默認(rèn)連結(jié)他的默認(rèn)數(shù)據(jù)庫test
說明創(chuàng)建數(shù)據(jù)庫成功!
查看數(shù)據(jù)庫:
控制臺中健入如下命令:show dbs,注意此時顯示的只會有l(wèi)ocal數(shù)據(jù)庫,卻沒有testDB,原因是因此時數(shù)據(jù)庫并沒有集合(數(shù)據(jù)),所以此時只有邏輯數(shù)據(jù)庫產(chǎn)生,并沒有產(chǎn)真正意義上的物理數(shù)據(jù),必須調(diào)用db.createCollection("集合名")后,具體的后面會講到,再次運行: show dbs命令,才能看到testDB數(shù)據(jù)庫,另外,mongodb的命令是區(qū)分大小寫的,這一點也是要注意!
4.2、刪除庫
dropDatabase()辦法
MongoDB db.dropDatabase() 命令是用來刪除一個現(xiàn)有的數(shù)據(jù)庫.
語法:
dropDatabase() 命令的基本語法如下:
> db.dropDatabase()
這將刪除選定的數(shù)據(jù)庫.如果還沒有選擇任何數(shù)據(jù)庫,然后它會刪除默認(rèn)的 ' test' 數(shù)據(jù)庫
示例:
首先,檢查列表數(shù)據(jù)庫通過使用命令 show dbs
>show dbs
local 0.78125GB
mydb 0.23012GB
test 0.23012GB
>
如果想刪除新數(shù)據(jù)庫 <mydb>, 那么 dropDatabase() 命令如下:
>use mydb
switched to db mydb
>db.dropDatabase()
>{ "dropped" : "mydb", "ok" : 1 }
>
現(xiàn)在檢查的數(shù)據(jù)庫列表:
>show dbs
local 0.78125GB
test 0.23012GB
>
4.3、創(chuàng)建集合
在mongodb里面,沒有表的概念,集合(collections)就相當(dāng)于傳統(tǒng)數(shù)據(jù)庫中的表.
createCollection() 辦法
MongoDB db.createCollection(name, options) 是用來創(chuàng)建集合.
語法:
基本的 createCollection() 命令語法如下:
db.createCollection(name, options)
在命令中, name 是要創(chuàng)建的集合的名稱. Options 是一個文件,用于指定配置的集合
選項參數(shù)是可選的,所以只需要到指定的集合名稱.以下是可以使用的選項列表:
例子:
createCollection() 辦法不使用選項的基本語法如下:
>use test
switched to db test
>db.createCollection("mycollection")
{ "ok" : 1 }
>
可以檢查通過使用創(chuàng)建的集合命令 show collections
>show collections
mycollection
system.indexes
下面的例子顯示了幾個重要的選項 createCollection()辦法的語法:
>db.createCollection("mycol", { capped : true, autoIndexID : true, size : 6142800, max : 10000 } )
{ "ok" : 1 }
>
在MongoDB中,不需要創(chuàng)建集合.當(dāng)插入一些文件 MongoDB 自動創(chuàng)建的集合.
>db.newdb.insert({"name" : "fwytech"})
>show collections
mycol
mycollection
system.indexes
newdb
>
4.4、刪除集合
drop() 辦法
MongoDB 的 db.collection.drop() 是用來從數(shù)據(jù)庫中刪除一個集合.
語法:
drop() 命令的基本語法如下
db.COLLECTION_NAME.drop()
示例:
首先,檢查可用的集合在數(shù)據(jù)庫 mydb
>use mydb
switched to db mydb
>show collections
mycol
mycollection
system.indexes
fwytech
>
現(xiàn)在刪除集合名稱為 mycollection
>db.mycollection.drop()
true
>
再次檢查到數(shù)據(jù)庫中的集合列表
>show collections
mycol
system.indexes
fwytech
>
drop() 辦法將返回 true,如果選擇成功收集被丟棄,否則將返回 false
第二部分:MongoDB高階
2.1、MongoDB支持的數(shù)據(jù)類型
MongoDB支持許多數(shù)據(jù)類型的列表下面給出:
?String : 這是最常用的數(shù)據(jù)類型來存儲數(shù)據(jù).在MongoDB中的字符串必須是有效的UTF-8.
?Integer : 這種類型是用來存儲一個數(shù)值.整數(shù)可以是32位或64位,這取決于您的服務(wù)器.
?Boolean : 此類型用于存儲一個布爾值 (true/ false) .
?Double : 這種類型是用來存儲浮點值.
?Min/ Max keys : 這種類型被用來對BSON元素的最低和最高值比較.
?Arrays : 使用此類型的數(shù)組或列表或多個值存儲到一個鍵.
?Timestamp : 時間戳.這可以方便記錄時的文件已被修改或添加.
?Object : 此數(shù)據(jù)類型用于嵌入式的文件.
?Null : 這種類型是用來存儲一個Null值.
?Symbol : 此數(shù)據(jù)類型用于字符串相同,但它通常是保留給特定符號類型的語言使用.
?Date : 此數(shù)據(jù)類型用于存儲當(dāng)前日期或時間的UNIX時間格式.可以指定自己的日期和時間,日期和年,月,日到創(chuàng)建對象.
?Object ID : 此數(shù)據(jù)類型用于存儲文檔的ID.
?Binary data : 此數(shù)據(jù)類型用于存儲二進(jìn)制數(shù)據(jù).
?Code : 此數(shù)據(jù)類型用于存儲到文檔中的JavaScript代碼.
?Regular expression : 此數(shù)據(jù)類型用于存儲正則表達(dá)式
2.2、MongoDB 插入文檔
insert() 辦法
要插入數(shù)據(jù)到 MongoDB 集合,需要使用 MongoDB 的 insert() 或 save() 辦法.
語法
insert() 命令的基本語法如下:
>db.COLLECTION_NAME.insert(document)
例子
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by: 'tutorials fwytech',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
這里 mycol 是集合的名稱,如前面的教程中創(chuàng)建.如果集合在數(shù)據(jù)庫中不存在,那么MongoDB 將創(chuàng)建此集合,然后把它插入文檔.插入文檔中,如果我們不指定_id參數(shù),然后MongoDB 本文檔分配一個獨特的ObjectId.
要插入單個查詢的多個文檔,可以傳遞一個數(shù)組 insert() 命令的文件.
示例
{
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by: 'tutorials fwytech',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
},
{
title: 'NoSQL Database',
description: 'NoSQL database doesn't have tables',
by: 'tutorials fwytech',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 20,
comments: [
{
user:'user1',
message: 'My first comment',
dateCreated: new Date(2013,11,10,2,35),
like: 0
}
]
}
])
2.3、MongoDB 更新文檔
MongoDB的 update() 和 save() 辦法用于更新文檔的集合. update()辦法更新現(xiàn)有的文檔值,而替換現(xiàn)有的文檔通過的文件中 save() 辦法.
MongoDB Update() 辦法
update()辦法更新現(xiàn)有文檔值.
語法:
update() 辦法的基本語法如下
>db.COLLECTION_NAME.update(SELECTIOIN_CRITERIA, UPDATED_DATA)
例子
考慮以下數(shù)據(jù)mycol集合.
下面的例子將設(shè)置新標(biāo)題'MongoDB Overview'的文件,更新其標(biāo)題是“New MongoDB Tutorial”
MongoDB默認(rèn)將只更新單一的文件,來更新多個你需要設(shè)置參數(shù)置'multi' 為true
Tutorial'}},)
MongoDB Save() 辦法
save() 辦法替換現(xiàn)有的文檔和通過新的文檔 save() 辦法
語法
MongoDB 的 save() 辦法的基本語法如下:
>db.COLLECTION_NAME.save()
例子
{
}
)
2.4、MongoDB 刪除文檔
remove() 辦法
MongoDB的 remove() 辦法用于從集合中刪除文檔.remove() 辦法接受兩個參數(shù).第一個是刪除criteria ,第二是justOne標(biāo)志:
deletion criteria :(可選)刪除標(biāo)準(zhǔn),根據(jù)文件將被刪除.
justOne : (可選)如果設(shè)置為true或1,然后只刪除一個文件.
語法:
基本語法remove()辦法如下
>db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)
例子
考慮以下數(shù)據(jù)mycol集合.
下面的例子將刪除所有的文件,其標(biāo)題是 'MongoDB Overview'
刪除只有一個
如果有多個記錄且要刪除的只有第一條記錄,那么設(shè)置remove()辦法中justOne參數(shù)
>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
例子:
先增加兩條記錄:
再刪除:
發(fā)現(xiàn)只有第一條刪除了
如果不加第2個參數(shù)1,則兩條記錄都會被刪除!
刪除所有文件
如果不指定刪除條件,然后MongoDB將從集合中刪除整個文件.這相當(dāng)于SQL的truncate命令.
2.5、MongoDB 查詢文檔
find() 辦法
要從MongoDB 查詢集合數(shù)據(jù),需要使用MongoDB 的 find() 辦法.
語法
基本的find()辦法語法如下
>db.COLLECTION_NAME.find()
find() 辦法將在非結(jié)構(gòu)化的方式顯示所有的文件.
pretty() 辦法
結(jié)果顯示在一個格式化的方式,可以使用 pretty() 辦法.
語法:
例子
{
"title": "MongoDB Overview",
"description": "MongoDB is no sql database",
"by": "tutorials fwytech",
"tags": ["mongodb", "database", "NoSQL"],
"likes": "100"
}
除了find() 辦法外,還有一個 findOne() 法,返回一個文件.
RDBMS Where子句和MongoDB等同語句
要查詢文件的一些條件的基礎(chǔ)上,可以使用下面的操作
AND 在MongoDB中用法
語法:
在 find() 辦法,如果通過多個鍵分離',',那么 MongoDB 處理 AND 條件.AND 基本語法如下所示:
例子
下面給出的例子將顯示所有的教程,標(biāo)題是“MongoDB Overview“
{
"_id": ObjectId(7df78ad8902c),
"title": "MongoDB Overview",
"description": "MongoDB is no sql database",
"by": "fwytech",
"tags": ["mongodb", "database", "NoSQL"],
"likes": "100"
}
對于上面給出的例子相當(dāng)于where子句 ' where by='fwytech' AND title='MongoDB Overview' , 可以通過任意數(shù)量的鍵值對在 find 子句.
MongoDB中OR
語法:
OR條件的基礎(chǔ)上要查詢文件,需要使用$or關(guān)鍵字.OR 基本語法如下所示:
{
$or: [
,
]
}
).pretty()
例子
下面給出的例子將顯示所有的教程,由'fwytech' 所寫或標(biāo)題是MongoDB Overview
{
"_id": ObjectId(7df78ad8902c),
"title": "MongoDB Overview",
"description": "MongoDB is no sql database",
"by": "fwytech",
"tags": ["mongodb", "database", "NoSQL"],
"likes": "100"
}
AND 和 OR 一起使用
例子
下面給出的例子將顯示有像的文件大于100,其標(biāo)題是“MongoDB Overview'或者是'fwytech' .等效于 SQL where子句 為 'where likes>10 AND (by = 'fwytech' OR title = 'MongoDB Overview')'
{
"_id": ObjectId(7df78ad8902c),
"title": "MongoDB Overview",
"description": "MongoDB is no sql database",
"by": "fwytech",
"tags": ["mongodb", "database", "NoSQL"],
"likes": "100"
}
2.6、MongoDB Limit/限制記錄
Limit() 辦法
要限制 MongoDB 中的記錄,需要使用 limit() 辦法. limit() 辦法接受一個數(shù)字型的參數(shù),這是要顯示的文檔數(shù).
語法:
limit() 辦法的基本語法如下
>db.COLLECTION_NAME.find().limit(NUMBER)
示例
考慮集合myycol具有以下的數(shù)據(jù)
{ "title":"a",”clicks”:1}
{ "title":"b",”clicks”:2}
{ "title":"c",”clicks”:3}
下面的例子將顯示只有2個文檔,當(dāng)執(zhí)行文檔查詢.
{ "title":"a",”clicks”:1}
{ "title":"b",”clicks”:2}
如果不指定數(shù)量 limit() 辦法的參數(shù),它會顯示從集合中的所有文件.
MongoDB Skip() 辦法
除了limit() 辦法,還有一個辦法skip() 也接受數(shù)字類型的參數(shù),并使用跳過的文檔數(shù).
語法:
skip()辦法基本語法如下
>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
示例:
下面的例子將只顯示第二個文檔.
{ "title":"b",”clicks”:2}
請注意,skip()辦法的默認(rèn)值是0
2.7、Node中操作MongoDB
PS:
前提-1:已經(jīng)安裝node
前提-2:已經(jīng)安裝mongodb
前提-3:項目中安裝了mongodb模塊
前提-4:Mongodb服務(wù)器已經(jīng)開啟監(jiān)聽
命令如下:cnpm install mongodb
2.7.1、連接數(shù)據(jù)庫
var mongo=require("mongodb");
var host="localhost";
var port="27017";
var server=new mongo.Server(host,port,);//創(chuàng)建數(shù)據(jù)庫所在的服務(wù)器服務(wù)器
var db=new mongo.Db("node-mongodb ",server,);//創(chuàng)建數(shù)據(jù)庫對象
db.open(function (err,db) {//連接數(shù)據(jù)庫
if(err)
throw err;
else{
console.log("成功建立數(shù)據(jù)庫連接");
db.close();
}
});
db.on("close", function (err,db) {//關(guān)閉數(shù)據(jù)庫
if(err) throw err;
else console.log("成功關(guān)閉數(shù)據(jù)庫.");
});
PS:關(guān)閉數(shù)據(jù)庫db.close([forceClose],[callback]);
forceClose為true時,強制關(guān)閉該數(shù)據(jù)庫,當(dāng)數(shù)據(jù)庫關(guān)閉后,不可再使用open開啟數(shù)據(jù)庫.forceClose為false時,不強制關(guān)閉數(shù)據(jù)庫,當(dāng)數(shù)據(jù)庫關(guān)閉后,可以再使用open打開.
2.7.2、插入數(shù)據(jù)
插入數(shù)據(jù)后,在控制臺中輸出數(shù)據(jù)文檔的內(nèi)容
var mongo=require("mongodb");
var host="localhost";
var port="27017";
var server=new mongo.Server(host,port,);//創(chuàng)建數(shù)據(jù)庫所在的服務(wù)器服務(wù)器
var db=new mongo.Db("node-mongodb",server,);//創(chuàng)建數(shù)據(jù)庫對象
db.open(function (err,db) {//連接數(shù)據(jù)庫
if(err)
throw err;
else{
db.collection("employees", function (err,collection) {
collection.insert(, function (err,docs) {
console.log(docs);
db.close();
});
});
}
});
db.on("close", function (err,db) {//關(guān)閉數(shù)據(jù)庫
if(err) throw err;
else console.log("成功關(guān)閉數(shù)據(jù)庫.");
});
2.7.3、讀取數(shù)據(jù)
var mongo=require("mongodb");
var host="localhost";
var port="27017" ;
var server=mongo.Server(host,port,);
var db=new mongo.Db("node-mongodb",server,);
db.open(function (err,db) {
db.collection("employees", function (err,collection) {
if(err) throw err;
else{
collection.find({}).toArray(function(err,docs){
else{
console.log(docs);
db.close();
}
});
}
});
});
2.7.4、帶查詢條件的搜索
var mongo=require("mongodb");
var host="localhost";
var port="27017" ;
var server=mongo.Server(host,port,);
var db=new mongo.Db("node-mongodb",server,);
db.open(function (err,db) {
db.collection("users", function (err,collection) {
if(err) throw err;
else{
collection.find(}).toArray(function(err,docs){
else{
console.log(docs);
db.close();
}
});
}
});
});
2.7.5、多條件查詢
插入一批數(shù)據(jù),并且進(jìn)行搜索type==food且price字段值小于10
var mongo=require("mongodb");
var host="localhost";
var port="27017" ;
var server=mongo.Server(host,port,);
var db=new mongo.Db("node-mongo-examples",server,);
var docs=[
{type:"food",price:11},
{type:"food",price:10},
{type:"food",price:9},
{type:"food",price:8},
{type:"book",price:9}
];
db.open(function (err,db) {
db.collection("goods", function (err,collection) {
if(err) throw err;
else{
collection.insert(docs, function (err,docs) {
else{
collection.find(}).toArray(
function(err,docs){
if(err) throw err;
else{
console.log(docs);
db.close();
}
}
);
}
})
}
});
});
查詢中的或的表達(dá):
如:查詢where type=”food” or price
collection.find({$or:[
,
}
]})
1.什么是MongoDB?有什么優(yōu)缺點?
2.MongoDB的增刪改查
3.Node中如何操作MongoDB
本小節(jié)我們主要介紹了MongoDB的涉及到開發(fā)部分的常規(guī)內(nèi)容,主要包含MongoDB的增刪改查及如何與Node連結(jié)操作的示例代碼.為后繼我們的更高級的項目部分做了一個必要的技術(shù)儲備.(PS:本部分內(nèi)容涉及到一些簡單的Node知識,需要大家自行補充一些關(guān)于Node的基本用法,后繼我也打算較系統(tǒng)的出一些關(guān)于Node及Angular2的零基礎(chǔ)入門內(nèi)容),下一篇我們將正式進(jìn)入《基于Angular2+Mongodb+Node技術(shù)實現(xiàn)的多用戶博客系統(tǒng)教程》--系統(tǒng)后臺Node Express框架搭建.
《實戰(zhàn)Angular2/Mongodb/Node博客系統(tǒng)(二)》是否對您有啟發(fā),歡迎查看更多與《實戰(zhàn)Angular2/Mongodb/Node博客系統(tǒng)(二)》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/10176.html