欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

思考题:如下场景如何设计mongo collection

程序员文章站 2022-05-27 11:58:22
...

Mongo 中collection相当于MySQL的表,那么当我有下面需求时,我应该如何设计我的collection及字段(key/value结构)? 场景及需求描述: 记录用户每次登录的业务标识及ip,以及登录时间 指定qid、ip需要查询该ip是否已经存在 针对上述需求,我的collection应

Mongo 中collection相当于MySQL的表,那么当我有下面需求时,我应该如何设计我的collection及字段(key/value结构)?

场景及需求描述:

  1. 记录用户每次登录的业务标识及ip,以及登录时间
  2. 指定qid、ip需要查询该ip是否已经存在

针对上述需求,我的collection应该如何设计?

目前有两种方案,正在纠结于哪个更好一些:

  • 方案一
  • [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]

第一种方案,清晰,多对多的关系。足够的明朗!相对查询条件应该足够的简单:findOne({userid:$userid,appid:$appid,ip:$ip});

第二种方案,一对多的关系,查询起来指定条件比较麻烦!findOne({userid:$userid,appid:$appid,ipArr.ip:$ip});

注明:上述说的查询语句可能不准确(刚接触Mongo)

那么到底应该选择哪种?又如何来创建合适的索引?

别急,现在增加一个新的需求:每个用户,同一业务,只记录最新的5条记录!

好吧,我现在还不确定方案如何选择,以及最后一个需求具体该如何实现。明天和同事们讨论,更新本日志Mark一下!
PS:是不是使用PHP来做条数限制会更好一些?

最终决定采用第二种方案,实现上通过PHP的client端获取用户ip数组,使用PHP来操作数组元素的增加及删除,最后再upsert至Mongo中。

使用php的查询条件可以如下(取决于你想取什么,实际实现上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]