mongodb 查询问题

2021-10-28 14:27:41 +08:00
 yinft

mongodb 里面 对标 mysql 的 case when 是怎么查询的,找了半天没找到实用的。用 mongotemplate 怎么写,麻烦有没有大佬给个资料或者直接指点一下。

我想按照这个 startTime ,每天分组求和, 把 6 点到 9 点的 flowInNum 字段数据求和然后给个新字段 monring 都默认是早上 把 11 点到 13 点的 flowInNum 字段数据求和然后给个新字段 afternoon 都默认是中午 把 18 点到 20 点的 flowInNum 字段数据求和然后给个新字段 night 都默认是晚上

2051 次点击
所在节点    MongoDB
7 条回复
libook
2021-10-28 14:50:37 +08:00
用 MongoDB 要先明确:
1. 抛弃原有关系型数据库的思维,用文档型数据库自己的思维模式来建模;
2. 具有强关系模型属性的数据不要用非关系型数据库,同理在关系模型下难以使用的数据结构可以考虑是否有对应的非关系模型更适合。

看题主的描述,推测题主希望将数据按照 startTime 来标记时间段为早、中、晚,可以使用聚合功能 aggregate 中的$switch 操作符。但具体好不好用还要看你分组之后要做什么操作。

另外注意数据库里通常使用 ISODate 格式存储的,你若关心北京时间要进行时区换算。
catinsides
2021-10-28 15:00:48 +08:00
先用$addFields 和$cond 标记出每条数据是早上、下午还是晚上,再用$group 根据早中晚分组,最后用$reduce 统计 flowInNum
yinft
2021-10-28 15:04:30 +08:00
@catinsides 我用 Aggregation 这个类只有 project 方法没有看到 addFields 方法。。。
yinft
2021-10-28 15:05:42 +08:00
@libook 接手的项目,其实我仰压根就觉得这种后期大量统计的数据不适合存 mongo
libook
2021-10-28 16:12:47 +08:00
@yinft #4 MongoDB 还是具备较好的数据统分能力的,在 MongoDB 创办初期就是以轻度大数据能力作为卖点。当然数据规模达到一定程度(如 1TB 以上)可能就得使用专门的大数据架构了。
hongweiliuruige
2021-10-28 16:44:21 +08:00
$project $addFields 都有啊,mongodb 的 aggregate 很强大。。。多看看文档吧
yinft
2021-10-28 17:25:11 +08:00
@hongweiliuruige 麻烦能指点一下代码怎么实现么,可以大致写一下么

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/811256

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX