【问题标题】:Fetch all records and join a column with grouped data in Mongoose (MongoDB)在 Mongoose (MongoDB) 中获取所有记录并加入包含分组数据的列
【发布时间】:2021-04-24 08:13:27
【问题描述】:

我有两个 Mongo 集合,用户和活动。每个活动都有一个createdAt 字段(日期类型)、一个hoursWorked(数字类型)字段和一个user 引用。每个用户只有一个 idname 字段(为简单起见)。我想获取活动列表并加入用户名,但我还想加入特定日期的hoursWorked 总数和每一行的用户。

以下是一些示例输入数据和预期结果:

活动合集

createdAt hoursWorked user
"2021-01-01" 2 a1
"2021-01-01" 1 a1
"2021-01-02" 3 a1
"2021-01-02" 3 a1
"2021-01-01" 1 b2
"2021-01-01" 1 b2
"2021-01-02" 2 b2

用户收藏

id name
a1 Alfred
b2 Brenda

预期输出

createdAt hoursWorked name totalHoursForDay
"2021-01-01" 2 Alfred 3
"2021-01-01" 1 Alfred 3
"2021-01-02" 3 Alfred 6
"2021-01-02" 3 Alfred 6
"2021-01-01" 1 Brenda 2
"2021-01-01" 1 Brenda 2
"2021-01-02" 5 Brenda 5

加入用户很容易,但我正在努力弄清楚如何按用户和日期聚合,然后加入所有内容。我目前计划只获取活动,然后在我的 Node Express 应用程序中循环聚合 JavaScript 对象中的时间然后以这种方式加入它,但我想知道是否有人有更有效的方法来使用 Mongoose 查询来做到这一点?这是我到目前为止的代码......现在非常基本。

const activities = await Activity
    .find({}, null, { sort: { createdAt: 1 } })
    .populate("user", "name").exec();

提前感谢您的帮助!

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    我认为您不能在单个查询中做到这一点。只需使用map 手动完成即可。 创建一个空对象,其中键是天数,值是当天工作的总小时数。

    const totalHoursForEachDay = {};
    activities.forEach(AC=>{
      if (totalHoursForEachDay[AC.createdAt]) // if it has that day{
        totalHoursForEachDay += AC.hoursWorked;
        return;
    } 
    // 
     totalHoursForEachDay[AC.createdAt] = AC.hoursWorked; 
    });
    

    然后将两者相互映射

    const new_activites = activities.map(AC=>{
        return {...AC , totalHours: totalHoursForEachDay[AC.createdAt]}
    
    });
    

    另一个答案

    将首先汇总每天的总小时数。 然后在第一个答案中做第二步

    【讨论】:

    • 谢谢,这也是我的想法。而且您建议使用 Node 在服务器端完成这一切,对吧?
    猜你喜欢
    • 2020-08-15
    • 1970-01-01
    • 2013-04-08
    • 2021-09-04
    • 2020-07-17
    • 2021-02-17
    • 2020-01-02
    • 1970-01-01
    • 2020-09-27
    相关资源
    最近更新 更多