自己設(shè)計(jì)的數(shù)據(jù)庫表- mongodb
let mongoose=require("mongoose");//require("mongodb")
var Schema = mongoose.Schema;
//最主要的功能盡量能快速1次或2次查詢找到,非主要功能盡量碎片化【多集合】,以保證可拓展性
//主要功能:人,文章,文章評(píng)論|說說|留言|回復(fù)評(píng)論,圖標(biāo)的增刪改查
//數(shù)據(jù)庫最好的邏輯:修改一個(gè)實(shí)體,這個(gè)實(shí)體的所有外鍵關(guān)聯(lián)它的所有信息,只根據(jù)外鍵就可以同步所有,不然東改西改邏輯容易亂!!
// 所有的操作,都是先獲取當(dāng)前操作實(shí)體的id,然后通過它的所有外鍵,去同步信息:
/*
所有的操作,都是以實(shí)體為中心,用外鍵關(guān)聯(lián)來同步到其他實(shí)體;這樣只要關(guān)注1件事情,實(shí)體改變,關(guān)聯(lián)實(shí)體內(nèi)信息是否全部同步到位
用一個(gè)實(shí)體作為
*/
// !!!刪除操作是最麻煩的,因?yàn)閷?shí)體之間有鏈接,如果刪一個(gè),另外的鏈接如何關(guān)聯(lián)處理,跟著刪肯定不行!!!!
// 刪除操作,人不能刪,其他實(shí)體刪除,只打一個(gè)disable標(biāo)簽,數(shù)據(jù)仍然存在,遇到disable實(shí)體就做特殊展示,包括關(guān)聯(lián)外鍵的特殊展示
// 1.文章: 文章分可修改和不可修改2個(gè)類型
// 增:文章集合內(nèi)插入;uid和atuid【同步人的信息】;
// 刪:文章集合內(nèi)刪除;然后看其他表的關(guān)聯(lián)項(xiàng)里是否涉及到這個(gè)數(shù)據(jù),有的話就要關(guān)聯(lián)
// 改:文章集合內(nèi)修改;然后看其他表的關(guān)聯(lián)項(xiàng)里是否涉及到這個(gè)數(shù)據(jù),有的話就要關(guān)聯(lián)
// 查:文章集合通過id|其他外鍵|標(biāo)簽,找文章;然后根據(jù)文章id,關(guān)聯(lián)所有外鍵【文章下評(píng)論串聯(lián)需要前端自己串】
// 2.評(píng)論:評(píng)論不可修改
// 增:評(píng)論類型中插入評(píng)論;link>targetId,link>originId,uid,atuid關(guān)聯(lián)同步信息【人和文章的同步,自身同步】
// 刪:~
// 查和改:都不做
// 3.用戶:不可刪,但可禁用,分權(quán)限等級(jí)【關(guān)聯(lián)文章操作權(quán)限,文章上熱搜權(quán)限 等各種權(quán)限,預(yù)留接口】
// 增:添加用戶,默認(rèn)引導(dǎo)界面添加“外鍵”關(guān)聯(lián)
// 刪:不需要做,沒見過那個(gè)網(wǎng)站還能刪自己帳號(hào)的
// 改:實(shí)體內(nèi)容+關(guān)聯(lián)外鍵【一大堆】
// 查:通過id或者其他屬性,查找某個(gè)人;然后根據(jù)文章id,關(guān)聯(lián)所有外鍵【文章下評(píng)論串聯(lián)需要前端自己串】
// 4.圖表:增刪改查都是通過先操作圖表,然后根據(jù)里面的外鍵,來同步關(guān)聯(lián)實(shí)體
// schema里面的屬性和字段,數(shù)據(jù)庫是會(huì)校驗(yàn)的,C++語言級(jí)別的校驗(yàn),
// 但是用戶基數(shù)過大,那么大量的增|改操作,以為數(shù)據(jù)的校驗(yàn)導(dǎo)致性能出問題
/*
關(guān)鍵的核心
1.每次操作實(shí)體,首先修改實(shí)體本身,然后列出和自己有關(guān)聯(lián)的其他所有表,看其他表的關(guān)聯(lián)項(xiàng)中是否要更新
2.實(shí)體與實(shí)體之間,一般只要單向關(guān)聯(lián)即可,這樣完全可以做到功能的需要;
單向關(guān)聯(lián)的好處是,操作實(shí)體,不需要修改其他關(guān)聯(lián)表;以操作最頻繁的表為主,也就是
在操作最頻繁的那個(gè)表中添加關(guān)聯(lián)key,可以減少常用功能對(duì)應(yīng)的操作次數(shù)
3.表和表之間做了雙向關(guān)聯(lián),有點(diǎn)是查詢方便,一張表包括了所有基本信息;
但缺點(diǎn)也很明顯,操作一張表的實(shí)體,還需要同步到關(guān)聯(lián)表,而且這個(gè)是原子操作
也就是必須通過事務(wù)來實(shí)現(xiàn)雙向關(guān)聯(lián)的表
*/
/*mongodb默認(rèn)值設(shè)置注意事項(xiàng):
1.設(shè)置了default,就不需要設(shè)置required了,因?yàn)椴还苡袥]有傳,因?yàn)闆]傳就用default,所以就不存在需要不需要,肯定有值
2.如果設(shè)置了required,但是沒有設(shè)置default,也沒有傳入,那么數(shù)據(jù)庫就會(huì)校驗(yàn)報(bào)錯(cuò)
3.對(duì)象里面屬性的默認(rèn)值試了一下,設(shè)置是沒有效果的,傳入就會(huì)覆蓋;不傳入的話數(shù)據(jù)庫也不會(huì)自動(dòng)創(chuàng)建默認(rèn)值
4.表內(nèi)的unique:true的字段不要輕易刪,不然后續(xù)添加的會(huì)一直報(bào)之前刪除的哪個(gè)鍵重復(fù),因?yàn)槊看尾迦攵际强眨罩迪嗤?/div>
解決辦法個(gè)人猜測時(shí)更新”集合“;
5.如果一個(gè)字段設(shè)置了unique,那他肯定是require
6.default的意思是,這個(gè)key的數(shù)值不放在表里,如果有人請(qǐng)求這個(gè)字段,那就從獲取默認(rèn)字段還給他
默認(rèn)字段的貨期是動(dòng)態(tài)的,比如設(shè)置默認(rèn)字段值是Date.now(),那么以后每次獲取,都是再獲取的時(shí)候
執(zhí)行Date.now(),然后返回這個(gè)值,所以這個(gè)壓根就不是不變的默認(rèn)值,所以設(shè)置默認(rèn)值
別用動(dòng)態(tài)的js計(jì)算,里面有變量的話,每次都不一樣
deafult值是不能用于find條件查找的,所以要設(shè)置條件查找的默認(rèn)值,還是得用Object.assign(default對(duì)象)
*/
/*----------------------------------------user start-------------------------------------------------------*/
//mongodb支持populate填充設(shè)置多表嵌套關(guān)聯(lián),mongoose用populate實(shí)現(xiàn),前提是表中設(shè)置ref
//涉及到改數(shù)據(jù)庫,還是算了,其實(shí);性能上還是$lookup比較好,但是只能雙表關(guān)聯(lián)
var userSchema=new Schema({//用系統(tǒng)自己產(chǎn)生的id,保證唯一性,返回?cái)?shù)據(jù)的時(shí)候帶上id
timeStamp:{//時(shí)間動(dòng)態(tài)碼,每次用戶登錄,先獲取動(dòng)態(tài)碼,然后返回管客戶端,再次ajax請(qǐng)求
//通過用戶名+密碼+動(dòng)態(tài)碼校驗(yàn),正確后就設(shè)置最新動(dòng)態(tài)碼,修改完后然后執(zhí)行登錄態(tài)記錄
type:Number
},
time:{
type:Number
},
passward:{
type:String,
required:true//require為true的數(shù)據(jù),在傳入數(shù)據(jù)庫的時(shí)候必須要有,如果沒有,就會(huì)報(bào)錯(cuò)
},
userName:{//用戶名|網(wǎng)名|昵稱|花名【唯一,大家網(wǎng)名不能相互重復(fù)】:注冊(cè)時(shí)可以不填寫,后續(xù)添加:因?yàn)槊Q唯一性容易重復(fù)導(dǎo)致用戶體驗(yàn)下降
type:String,
unique:true
},
phone:{
type:String,
required:true,
unique:true
},
name:{//真實(shí)姓名
type:String,
default:""
},
age:{
type:String,
default:""
},
sex:{
type:String,
default:""
},
userPic:{
type:String,
default:"/upload/default.png"http://用戶沒有頭像就用默認(rèn)圖片做頭像
},
level:{//個(gè)人的等級(jí),等級(jí)越高,主頁展示得越考前:這個(gè)等級(jí)通過文章的linkUser和linkComment綜合評(píng)分,得到一個(gè)等級(jí)
type:Number,
default:1
},
categroy:{//用戶的不同種類,區(qū)分不同的權(quán)限,后續(xù)再設(shè)置,默認(rèn)權(quán)限1,正常用戶
// type:[Schema.Types.Integer],
type:String,
default:"1"
},
//關(guān)聯(lián)的所有用戶
linkUser:{
type:Object,
properties:{
fans:{//粉絲 不需要,fans和attention只需要一個(gè),不需要雙向關(guān)聯(lián)
type:Array//uid
},
attention:{//關(guān)注哪些人
type:Array//uid
},
blackList:{//黑名單
type:Array//uid
},
specialAttention:{//特別關(guān)注
type:Array//uid
}
}
}
});
/*----------------------------------------user end-------------------------------------------------------*/
/*----------------------------------------article start-------------------------------------------------------*/
//文章【不包含說說,評(píng)論,留言板留言等,只是文章】
var articleSchema=new Schema({
time:{//文章寫的時(shí)間
type:Number,
required:true
},
title:{//標(biāo)題
type:String,
required:true
},
content:{//內(nèi)容
type:String,
required:true
},
tag:{//標(biāo)簽
type:Array
},
//默認(rèn)不鑒權(quán),所以篩選條件中不需要添加accessViewUser|accessCommentUser
//一旦用戶開啟鑒權(quán),需要給accessViewUser|accessCommentUser設(shè)置all或者特定的人
//這樣下次訪問這篇文章,遇到needAccess為true,才能通過accessViewUser|accessCommentUser
//數(shù)組內(nèi)對(duì)應(yīng)的值來判斷是否能讓用戶訪問
needAccess:{//true表示需要鑒權(quán)才能查看,這個(gè)參數(shù)查詢的時(shí)候要帶過來;
type:Boolean
},
categroy:{//文章的類型,類型1表示默認(rèn)文章,無類型;2表示技術(shù)分享;3每日復(fù)盤;4表示熱點(diǎn)討論
type:String,
default:"1"
},
level:{//文章的等級(jí),等級(jí)越高,主頁展示得越考前:這個(gè)等級(jí)通過文章的linkUser和linkComment綜合評(píng)分,得到一個(gè)等級(jí)
type:Number,
default:1
},
//--------------------------下面是關(guān)聯(lián)數(shù)據(jù)----------------------------------
linkUser:{
type:Object,
required:true,
properties:{
uid:{//去關(guān)聯(lián)用戶表:誰寫的
type:mongoose.Types.ObjectId,//mongodb的compass中查看
required:true
},
accessViewUser:{//數(shù)組中出現(xiàn)"all",表示所有都可以查看,
type:Array
},
accessCommentUser:{//數(shù)組中出現(xiàn)"all",表示所有都可以查看,
type:Array
},
fav:{//點(diǎn)贊 :uid
type:Array
},
collect:{//收藏 :uid
type:Array
},
relay:{//轉(zhuǎn)發(fā) :uid
type:Array
},
comment:{//評(píng)論的人:uid
type:Array
},
atList:{//評(píng)論的@相關(guān)人員,atId主動(dòng)at的人;atedId是被at的人
type:Array//{atId,atedId,atType:2表示文章的at,4表示評(píng)論的at}
}
}
}
});
/*----------------------------------------article end-------------------------------------------------------*/
/*----------------------------------------comment start-------------------------------------------------------*/
/*短文:因?yàn)檫@個(gè)量非常大,所以需要單獨(dú)拎出來,不能和文章放在一個(gè)集合里面
1.“個(gè)人說說”:沒針對(duì)誰,自己發(fā)的說說,
2.“文章評(píng)論:針對(duì)文章的第一層留言,人與人之間回復(fù)不算”,
3.“留言板留言:針對(duì)某個(gè)人,是某人留言板下的1級(jí)留言,”,
4.“評(píng)論回復(fù)”:就是2級(jí)+的評(píng)論【上面123都是1級(jí)評(píng)論】
5.“圖表留言”:針對(duì)圖表的第一層留言
注意:
1.這個(gè)表的linkOther必須建立索引,查詢非常多,量也大,所以需要的索引的內(nèi)存也很大
如果有1億的數(shù)據(jù),索引內(nèi)存大小是: 2^32 = 4G;【每個(gè)用戶平均萬級(jí)別數(shù)據(jù)條數(shù);1億用戶】
所以萬億級(jí)別的表就是極限了【到時(shí)候看下建立索引需要多大內(nèi)存】
2.人物,文章,圖表的刪除操作邏輯都不復(fù)雜,也好操作;
但評(píng)論的增加和刪除,必須有一個(gè)復(fù)雜,另外一個(gè)才好操作;
新增較多刪除少,所以新增做簡單,刪除做復(fù)雜;
方案1:刪除的時(shí)候,評(píng)論下面所有的評(píng)論,要一級(jí)一級(jí)關(guān)聯(lián)【前端做關(guān)聯(lián):列出所有下級(jí)評(píng)論id】;
最后統(tǒng)一發(fā)達(dá)數(shù)據(jù)庫做批量刪除;這樣的話,別人下面的評(píng)論不明所以就不見了
體驗(yàn)不好
方案2:單獨(dú)刪除當(dāng)前評(píng)論,級(jí)聯(lián)下面所有的評(píng)論【前端做關(guān)聯(lián):列出所有下級(jí)評(píng)論id】,
統(tǒng)一給下面所有的評(píng)論的linkOther添加屬性isDelete,告訴它父節(jié)點(diǎn)被刪除;
同時(shí)數(shù)據(jù)庫每隔一段時(shí)間執(zhí)行刪除linkOther.isDelete是true的comment文檔
*/
var commentSchema=new Schema({//自動(dòng)產(chǎn)生的id為cid,就是評(píng)論id
time:{//文章寫的時(shí)間
type:Number
},
content:{//內(nèi)容
type:String,
required:true
},
level:{//評(píng)論等級(jí),等級(jí)越高,文章內(nèi)展示得越靠前:這個(gè)等級(jí)通過linkUser和linkOther綜合評(píng)分,得到一個(gè)等級(jí)
type:Number,
default:1
},
//--------------------------下面是關(guān)聯(lián)數(shù)據(jù)----------------------------------
linkUser:{
type:Object,
required:true,
properties:{
uid:{//誰寫的
type:mongoose.Types.ObjectId,//mongodb的compass中查看
required:true
},
fav:{//點(diǎn)贊 :uid
type:Array
},
collect:{//收藏 :uid
type:Array
},
relay:{//轉(zhuǎn)發(fā) :uid
type:Array
},
comment:{//評(píng)論的人:uid
type:Array
},
atList:{//評(píng)論的@相關(guān)人員,atId主動(dòng)at的人的id;atedId是被at的人的id:atId和上面的uid一樣,就是作者主動(dòng)at別人
type:Array//{atId,atedId,atType:2表示文章的at,4表示評(píng)論的at}
}
}
},
//鏈接的父元素節(jié)點(diǎn):一條評(píng)論只會(huì)有一個(gè)外部關(guān)聯(lián)項(xiàng),也就是只有一個(gè)category類型
// 通過linkOrigin,前端就可以串聯(lián)出某篇文章下的所有評(píng)論數(shù)據(jù)和關(guān)系
// 前端需要通過遍歷樹操作,才能把所有評(píng)論串起來,前端邏輯比較復(fù)雜,但為了數(shù)據(jù)庫的簡化+可拓展性,是值得的
// linkOther改名為linkParent比較恰當(dāng),但業(yè)務(wù)寫好了沒法改了
linkOther:{//
type:Object,
required:true,
properties:{
category:{
//這條評(píng)論自己的類別:[1,2,3,4,5:詳細(xì)介紹見下面]【注意這個(gè)和linkOrigin要區(qū)分】
// 這里的category是評(píng)論自身的屬性,不是它的關(guān)聯(lián)節(jié)點(diǎn)的屬性;
// 沒有必要知道關(guān)聯(lián)節(jié)點(diǎn)的屬性
type:String,
required:true
},
targetId:{//被回復(fù)方【article|comment】的id:針對(duì)的哪個(gè)目標(biāo)的“回復(fù)|評(píng)論”
// 如果category是1類型,targetId就是自己個(gè)人的uid;【放自己說說列表】
// 如果category是2類型,targetId就是aid,放到對(duì)應(yīng)文章下面
// 如果category是3類型,targedid就是其他人的uid【放對(duì)方留言板1級(jí)留言】
// 如果category是4類型,targedid就是cid,放到其他評(píng)論的下面
// 如果category是5類型,targedid就是chartId,放到對(duì)應(yīng)圖表下面
type:mongoose.Types.ObjectId,//mongodb的compass中查看
required:true
},
targetUserId:{//被回復(fù)方的用戶Id
type:mongoose.Types.ObjectId,
required:true
}
}
},
//這條評(píng)論的源頭是哪里:他和linkOther的category字段意義不同,別混淆
//這個(gè)字段是為了方便數(shù)據(jù)的查找,找到源頭就可以找出所有下面的評(píng)論,接下來由前端去串聯(lián)
//如果沒有這個(gè)字段,那么評(píng)論就要在后臺(tái)一級(jí)一級(jí)地串聯(lián),非常耗費(fèi)性能。
linkOrigin:{//
type:Object,
required:true,
properties:{
category:{//這條評(píng)論的源頭的類型:[1,2,3,4,5:詳細(xì)介紹見下面]
type:String,
required:true
},
targetId:{//屬于的那個(gè)源頭的id
// 如果category是1類型,targetId就是cid,源頭是個(gè)人的說說
// 如果category是2類型,targetId就是aid,源頭是文章
// 如果category是3類型,targedid就是uid,源頭是別人的留言板
// 如果category是5類型,targedid就是chartId,源頭是圖表
type:mongoose.Types.ObjectId,//mongodb的compass中查看
required:true
}
}
}
});
/*----------------------------------------comment end-------------------------------------------------------*/
/*----------------------------------------tag start-------------------------------------------------------*/
//標(biāo)簽系統(tǒng):追蹤文章類型,當(dāng)前熱搜【熱度,和持續(xù)時(shí)間】
var tagSchema=new Schema({
startTime:{//標(biāo)簽新建的時(shí)間
type:Number,
required:true
},
latestTime:{//標(biāo)簽最新被別人添加的時(shí)間
type:Number,
required:true
},
content:{//內(nèi)容
type:String,
required:true
},
categroy:{//文章的類型,類型1表示默認(rèn)文章,無類型;2表示技術(shù)分享;3每日復(fù)盤;4表示熱點(diǎn)討論
type:String,
default:"1"
},
level:{//標(biāo)簽等級(jí),等級(jí)越高,各種業(yè)務(wù)展示的優(yōu)先級(jí)越高
type:Number,
default:1
},
//--------------------------下面是關(guān)聯(lián)數(shù)據(jù)----------------------------------
linkArticle:{//cid
type:Array
},
linkUser:{//uid
type:Array
},
});
/*----------------------------------------tag end-------------------------------------------------------*/
/*----------------------------------------chart start-------------------------------------------------------*/
//圖表:結(jié)構(gòu)和文章基本一樣,只是標(biāo)題非必須
var chartSchema=new Schema({
time:{//時(shí)間
type:Number
},
title:{//圖標(biāo)可以沒有標(biāo)題,也可以有
type:String,
default:""
},
content:{//圖表數(shù)據(jù)內(nèi)容,轉(zhuǎn)成字符串
type:String,
required:true
},
tag:{//標(biāo)簽
type:Array
},
categroy:{//文章的類型,類型1表示默認(rèn)圖表【以后可增加各種類型圖表】
type:String,
default:"1"
},
level:{//圖表的推送等級(jí),等級(jí)越高,展示得越靠前:這個(gè)等級(jí)通過圖表的linkUser和linkComment綜合評(píng)分,得到一個(gè)等級(jí)
type:String,
default:"1"
},
//--------------------------下面是關(guān)聯(lián)數(shù)據(jù)----------------------------------
linkUser:{
type:Object,
required:true,
properties:{
uid:{//去關(guān)聯(lián)用戶表:誰寫的
type:mongoose.Types.ObjectId,//mongodb的compass中查看
required:true
},
fav:{//點(diǎn)贊 :uid
type:Array
},
collect:{//收藏 :uid
type:Array
},
relay:{//轉(zhuǎn)發(fā) :uid
type:Array
},
comment:{//評(píng)論的人:uid
type:Array
},
atList:{//評(píng)論的@相關(guān)人員,atId主動(dòng)at的人;atedId是被at的人
type:Array//{atId,atedId,atType:2表示文章的at,4表示評(píng)論的at,5表示圖表的at}
}
}
}
});
/*----------------------------------------char end-------------------------------------------------------*/
/*----------------------------------------熱度評(píng)分表 不做了,沒必要做那么好,又不是靠這個(gè)賺錢,只是練習(xí)而已 start-------------------------------------------------------*/
//熱門推薦系統(tǒng):產(chǎn)生熱門作者和熱門文章
//每次點(diǎn)擊的時(shí)候,都需要操作修改統(tǒng)計(jì)表,所以不能放在主表,以免操作過于頻繁
//每次熱度值變化,任何點(diǎn)贊,評(píng)論,轉(zhuǎn)發(fā),收藏,點(diǎn)擊文章,都會(huì)涉及文章熱度變化,都要查詢表
// 所以必須獨(dú)立出來,否則對(duì)內(nèi)容表的操作太頻繁,容易卡死
// var hotArticleSchema=new Schema({
// aid:"文章id",
// uid:"作者id",
// uv:[{uid:"",pv:[time,time,...]},{uid:"",pv:[time,time,...]}],
// fav:[{uid:"",time:""},{uid:"",time:""}],
// collect:[{uid:"",time:""},{uid:"",time:""}],
// comment:[{uid:"",list:[{cid,time}]},{uid:"",list:[{cid,time}]}],
// cotalHot:"總體熱度",
// curHot:"當(dāng)前熱度"http://設(shè)置最近的某段時(shí)間內(nèi)的累計(jì)熱度
// });
// //用戶推薦較少,所以依賴于其他表的搜索,內(nèi)部不添加實(shí)體信息;熱度邏輯在返回客戶端信息后再計(jì)算統(tǒng)計(jì)
// var hotUserSchema=new Schema({//計(jì)算總分需要查hotArticleSchema表【獲取文章評(píng)分】+user表【獲取粉絲評(píng)分】
// uid:"用戶id",
// totalHot:100,//總體熱度【粉絲權(quán)重可設(shè)置】:粉絲+所有文章評(píng)分累計(jì)
// curHot:10//最近熱度【時(shí)間寬度可設(shè)置】:最近一段時(shí)間粉絲增量+最近一段時(shí)間文章評(píng)分累計(jì)
// });
/*----------------------------------------熱度評(píng)分表 end-------------------------------------------------------*/
//必須的不傳會(huì)報(bào)錯(cuò),非必須的都給默認(rèn)值,這樣創(chuàng)建的時(shí)候就比較方便,用不到defaultUser,因?yàn)閿?shù)據(jù)庫里設(shè)置了
let defaultUser={//用系統(tǒng)自己產(chǎn)生的id,保證唯一性,返回?cái)?shù)據(jù)的時(shí)候帶上id
timeStamp:Date.now(),
time:Date.now()//注冊(cè)時(shí)間
// passward:"",//必須前端傳入
// userName:"",//必須前端傳入
// phone:"",//必須前端傳入
// //關(guān)聯(lián)的所有用戶
// linkUser:{
// fans:[],
// attention:[],
// blackList:[],
// specialAttention:[]
// }
}
//新建文章的默認(rèn)藍(lán)本
var defaultArticle={//這個(gè)是服務(wù)器啟動(dòng)時(shí)間,不是實(shí)時(shí)的時(shí)間
time:Date.now()
// title:"",//必須前端傳入
// content:"",//必須前端傳入
// tag:[],
// linkUser:{
// uid:"",//必須后端傳入
// fav:[],
// collect:[],
// relay:[],
// comment:[],
// atList:[]
// }
};
var defaultComment={
time:Date.now()
// time:Date.now(),
// content:"",//必須前端傳入
// linkUser:{
// uid:""http://必須前端傳入
// },
// linkOther:{
// category:0,//必須前端傳入
// targetId:""http://必須前端傳入
// }
// linkOrigin:{
// category:0,//必須前端傳入
// targetId:""http://必須前端傳入
// }
};
//新建圖表的時(shí)候用到
var defaultChart={
time:Date.now()
// time:Date.now(),
// title:"",
// content:"",//必須前端傳入
// tag:[],
// linkUser:{
// uid:"",//必須前端傳入
// fav:[],
// collect:[],
// relay:[],
// comment:[],
// atList:[]
// }
};
var defaultTag={
startTime:Date.now(),
latestTime:Date.now()
// time:Date.now(),
// title:"",
// content:"",//必須前端傳入
// tag:[],
// linkUser:{
// uid:"",//必須前端傳入
// fav:[],
// collect:[],
// relay:[],
// comment:[],
// atList:[]
// }
};
userSchema = mongoose.model('User',userSchema );
articleSchema = mongoose.model('Article',articleSchema );
commentSchema = mongoose.model('Comment',commentSchema );
chartSchema = mongoose.model('Chart',chartSchema );
tagSchema = mongoose.model('Tag',tagSchema );
module.exports= {tagSchema,userSchema,articleSchema,commentSchema,chartSchema,defaultUser,defaultArticle,defaultComment,defaultChart,defaultTag};
//關(guān)聯(lián)的所有圖表:chart實(shí)體中有了,這里沒必要做反向關(guān)聯(lián)
// linkChart:{
// type:Object,
// properties:{
// content:{//自己有哪些圖表
// type:Array//圖標(biāo)的chartid的列表
// },
// fav:{//點(diǎn)贊的圖表
// type:Array
// },
// collect:{//收藏的圖表
// type:Array
// },
// relay:{//轉(zhuǎn)發(fā)的圖表
// type:Array
// },
// atList:{
// type:Array//自己at別人的圖表【文章可以是別人的,也可以是自己的】
// // 數(shù)組內(nèi)是對(duì)象,別人at我的信息是否已讀用isRead,
// // 用于用戶登錄的時(shí)候或?qū)崟r(shí)提醒用戶瀏覽“未讀信息”
// // {atType:2表示文章的at,4表示評(píng)論的at,atId:內(nèi)容對(duì)應(yīng)的id,isRead:是否已讀}
// },
// atedList:{
// type:Array//別人at自己的圖表【文章可以是別人的,也可以是自己的】
// }
// }
// },
//關(guān)聯(lián)的所有文章:article實(shí)體中有了,這里沒必要做反向關(guān)聯(lián)
// linkArticle:{
// type:Object,
// properties:{
// content:{ //自己的文章
// type:Array//aid
// },
// fav:{
// type:Array
// },
// collect:{
// type:Array
// },
// relay:{
// type:Array
// },
// atList:{
// type:Array
// },
// atedList:{
// type:Array
// }
// }
// },
//關(guān)聯(lián)的所有評(píng)論:comment實(shí)體中有了,這里沒必要做反向關(guān)聯(lián)
// linkComment:{
// type:Object,
// properties:{
// content:{//自己寫的所有“文章評(píng)論|回復(fù)評(píng)論|說說|留言板評(píng)論”
// type:Array//cid
// },
// fav:{//我收藏點(diǎn)贊的所有評(píng)論
// type:Array
// },
// collect:{
// type:Array
// },
// relay:{
// type:Array
// },
// atList:{
// type:Array
// },
// atedList:{
// type:Array
// },
// msgboard:{//留言板,誰給我留言了
// type:Array//cid
// }
// }
// }
// //關(guān)聯(lián)評(píng)論:沒必要做反向關(guān)聯(lián),評(píng)論里面已經(jīng)包含對(duì)應(yīng)關(guān)聯(lián)文章的id
// linkComment:{
// type:Array//[{type:2|4,contentId:aid|cid}],type=2表示文章的1級(jí)評(píng)論,type=4表示評(píng)論回復(fù)
// }
//關(guān)聯(lián)評(píng)論:圖表下的所有評(píng)論:沒必要反向關(guān)聯(lián),comment中已經(jīng)有關(guān)聯(lián)項(xiàng)了
// linkComment:{
// type:Array//[{type:2|4,contentId:aid|cid}],type=5表示圖表的1級(jí)評(píng)論,type=4表示評(píng)論回復(fù)
// }

浙公網(wǎng)安備 33010602011771號(hào)