【问题标题】:How to calculate, and map a array from one certain field如何计算和映射来自某个字段的数组
【发布时间】:2021-08-28 19:26:43
【问题描述】:

我创建了一个简单的猫鼬查询来获取信息数组,然后对其进行排序。

const stats_m = await monthlySessions.find({}).sort({ month: 1 });

响应看起来大致如下:

[
  {
    _id: 60c3dce8f27cc56bbcf20e94,
    steamID: '76561199105033642',
    displayName: 'username',
    LastJoinDate: 'Sat Jun 12 2021 01:00:04 GMT+0300 (Eastern European Summer Time)',
    LastLeaveDate: 'Sat Jun 12 2021 01:00:07 GMT+0300 (Eastern European Summer Time)',
    SessionTime: 14,
    UID: '60a6572b98a160df4ffc8b20',
    month: 5,
    year: '2021',
    __v: 0
  },
  {
    _id: 60c3ddda65e2073ea162cdfa,
    displayName: 'username',
    LastJoinDate: 'Sat Jun 12 2021 01:00:04 GMT+0300 (Eastern European Summer Time)',
    LastLeaveDate: 'Sat Jun 12 2021 01:00:07 GMT+0300 (Eastern European Summer Time)',
    SessionTime: 14,
    UID: '60a6572b98a160df4ffc8b20',
    month: 6,
    year: '2021',
    __v: 0,
    steamID: '76561199105033642'
  }
]

现在我需要做的是获取具有相同字段值month 的每个对象,并将SessionTime 添加在一起,然后从中创建一个新对象,该对象仅包含monthyear , SessionTime

我该怎么做呢?

【问题讨论】:

  • 请将输入和预期输出作为文本发布。
  • @iota 好的,我将帖子更新为预期的文本输出。
  • 预期输出是什么?
  • 输出是我粘贴到帖子中的对象数组。但是,随着时间的推移,它将包含更多具有不同值的对象。

标签: javascript node.js arrays mongodb mongoose


【解决方案1】:

好的,我实际上对 Mongoose 了解不多,但前几天我帮助一个家伙从 Mongoose 模型中进行了类似的数据过滤过程,并且获取数据很棘手。我们最终不得不使用lean() - 就像我在下面一样。

您可能不需要它,因此下面的 sn-p 具有将您的对象过滤成您想要的结果的代码。它使用reduce() 来跟踪和合并记录。您没有指定这一点 - 但我根据 年和月 进行组合 - 因为您只指定了月份。让我知道是否需要调整它。我还在其中添加了一个额外的对象来显示它是如何加起来的 SessionTime

const stats_m = await monthlySessions.find({})
  .lean().exec(function (err, docs) {
    return Object.values(docs.reduce((b, a) => {
  let key = a.month + '' + a.year
  if (b.hasOwnProperty(key)) {
    b[key].SessionTime += +a.SessionTime
  } else {
    b[key] = {
      month: a.month,
      year: a.year,
      SessionTime: a.SessionTime
    }
  }
  return b
}, {}))  
}).sort({ month: 1 });

const docs = [{
    _id: '60 c3dce8f27cc56bbcf20e94',
    steamID: '76561199105033642',
    displayName: 'username',
    LastJoinDate: 'Sat Jun 12 2021 01:00:04 GMT+0300 (Eastern European Summer Time)',
    LastLeaveDate: 'Sat Jun 12 2021 01:00:07 GMT+0300 (Eastern European Summer Time)',
    SessionTime: 14,
    UID: '60a6572b98a160df4ffc8b20',
    month: 5,
    year: '2021',
    __v: 0
  },
  {
    _id: '60 c3ddda65e2073ea162cdfa',
    displayName: 'username',
    LastJoinDate: 'Sat Jun 12 2021 01:00:04 GMT+0300 (Eastern European Summer Time)',
    LastLeaveDate: 'Sat Jun 12 2021 01:00:07 GMT+0300 (Eastern European Summer Time)',
    SessionTime: 14,
    UID: '60a6572b98a160df4ffc8b20',
    month: 6,
    year: '2021',
    __v: 0,
    steamID: '76561199105033642'
  },
  {
    _id: '60 c3ddda65e2073eea162cdfa',
    displayName: 'username2',
    LastJoinDate: 'Sat Jun 12 2021 01:00:04 GMT+0300 (Eastern European Summer Time)',
    LastLeaveDate: 'Sat Jun 12 2021 01:00:07 GMT+0300 (Eastern European Summer Time)',
    SessionTime: 24,
    UID: '60a6572b98a160df4ffc8b20',
    month: 6,
    year: '2021',
    __v: 0,
    steamID: '76561199105033642'
  }
]

let ndocs = Object.values(docs.reduce((b, a) => {
  let key = a.month + '' + a.year
  if (b.hasOwnProperty(key)) {
    b[key].SessionTime += +a.SessionTime
  } else {
    b[key] = {
      month: a.month,
      year: a.year,
      SessionTime: a.SessionTime
    }
  }
  return b
}, {}))

console.log(ndocs)

【讨论】:

    【解决方案2】:

    您可以将聚合与 $group 一起使用:

    db.collection.aggregate([
      {
        $group: {
          _id: {
            month: "$month",
            year: "$year"
          },
          SessionTime: {
            $sum: "$SessionTime"
          },
      
        }
      },
      {
        $project: {
          _id: 0,
          month: "$_id.month",
          year: "$_id.year",
          SessionTime: 1
        }
      }
    ])
    

    Mongoplayground

    【讨论】:

      猜你喜欢
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 2020-06-24
      • 2012-06-09
      • 2019-06-17
      相关资源
      最近更新 更多