IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

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

小小子 2013-04-06 22:59:21 累计浏览 3,167 次
本机暂存

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

   场景及需求描述:

  • 记录用户每次登录的业务标识及ip,以及登录时间

  • 指定qid、ip需要查询该ip是否已经存在

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

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

  • 方案一

  • {'userid':$userid,'appid':$appid,'ip':$ip,'logintime':timestamp}
  • 方案二

  • {'userid':$userid,

        'appid':$appid,

        'ipArr':{

              {'ip':$ip1,'logintime':$timestamp1},

              {'ip':$ip2,'logintime':$timestamp2}

         }

       }

       第一种方案,清晰,多对多的关系。足够的明朗!相对查询条件应该足够的简单: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即可限制条件了)

    var_dump($monObj->remove(array('userid'=>'1234567','appid'=>'abc','ipArr'=

同分类推荐文章

  1. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
  2. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
  3. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)

查看更多 数据库 文章 →

建议继续学习

  1. HFile存储格式 (累计阅读 15,972)
  2. hbase运维 (累计阅读 14,922)
  3. 什么是全栈工程师? (累计阅读 14,038)
  4. hbase介绍 (累计阅读 12,366)
  5. HBase技术介绍 (累计阅读 8,073)
  6. SQL vs NoSQL:数据库并发写入性能比拼 (累计阅读 8,002)
  7. Redis作者谈Redis应用场景 (累计阅读 7,671)
  8. HBase随机写以及随机读性能测试 (累计阅读 7,546)
  9. Web应用的缓存设计模式 (累计阅读 7,442)
  10. Using MySQL as a NoSQL (累计阅读 7,107)