Mongo 中collection相當(dāng)于MySQL的表,那么當(dāng)我有下面需求時(shí),我應(yīng)該如何設(shè)計(jì)我的collection及字段(key/value結(jié)構(gòu))? 場(chǎng)景及需求描述: 記錄用戶每次登錄的業(yè)務(wù)標(biāo)識(shí)及ip,以及登錄時(shí)間 指定qid、ip需要查詢?cè)搃p是否已經(jīng)存在 針對(duì)上述需求,我的collection應(yīng)
Mongo 中collection相當(dāng)于MySQL的表,那么當(dāng)我有下面需求時(shí),我應(yīng)該如何設(shè)計(jì)我的collection及字段(key/value結(jié)構(gòu))?
場(chǎng)景及需求描述:
針對(duì)上述需求,我的collection應(yīng)該如何設(shè)計(jì)?
目前有兩種方案,正在糾結(jié)于哪個(gè)更好一些:
[cc lang="javascript"]
{‘userid’:$userid,’appid’:$appid,’ip’:$ip,’logintime’:timestamp}
[/cc]
[cc lang="javascript"]
{‘userid’:$userid,
‘appid’:$appid,
‘ipArr’:{
{‘ip’:$ip1,’logintime’:$timestamp1},
{‘ip’:$ip2,’logintime’:$timestamp2}
}
}
[/cc]
第一種方案,清晰,多對(duì)多的關(guān)系。足夠的明朗!相對(duì)查詢條件應(yīng)該足夠的簡(jiǎn)單:findOne({userid:$userid,appid:$appid,ip:$ip});
第二種方案,一對(duì)多的關(guān)系,查詢起來(lái)指定條件比較麻煩!findOne({userid:$userid,appid:$appid,ipArr.ip:$ip});
注明:上述說(shuō)的查詢語(yǔ)句可能不準(zhǔn)確(剛接觸Mongo)
那么到底應(yīng)該選擇哪種?又如何來(lái)創(chuàng)建合適的索引?
別急,現(xiàn)在增加一個(gè)新的需求:每個(gè)用戶,同一業(yè)務(wù),只記錄最新的5條記錄!
好吧,我現(xiàn)在還不確定方案如何選擇,以及最后一個(gè)需求具體該如何實(shí)現(xiàn)。明天和同事們討論,更新本日志Mark一下!
PS:是不是使用PHP來(lái)做條數(shù)限制會(huì)更好一些?
最終決定采用第二種方案,實(shí)現(xiàn)上通過PHP的client端獲取用戶ip數(shù)組,使用PHP來(lái)操作數(shù)組元素的增加及刪除,最后再upsert至Mongo中。
使用php的查詢條件可以如下(取決于你想取什么,實(shí)際實(shí)現(xiàn)上userid及appid即可限制條件了)
[cc lang="php"]
var_dump($monObj->remove(array(‘userid’=>’1234567′,’appid’=>’abc’,'ipArr’=>array(‘$elemMatch’=>array(‘ip’=>’127.0.0.0.1′)))));
[/cc]
原文地址:思考題:如下場(chǎng)景如何設(shè)計(jì)mongo collection, 感謝原作者分享。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com