按键搜索对象列表并返回计数

时间:2021-07-05 14:43:42

标签: javascript node.js arrays mongodb mongoose

我将 MongoDB 与 Node API 一起使用,并且一个路由需要返回集合中每种类型的汇总计数。

我没有使用 MongoDB 聚合管道,因为我需要的数据已经发送到 API 以用于同一路由中的其他汇总统计信息。

注意:为了便于使用,我将下面的 _id 放在单引号中,但它们是 mongoose.Schema.Types.ObjectId

所以,鉴于我有一个像这样的 mongo 对象数组:

const allObs = [
  {
    _id: '60d5f37fd93fb82ebe84d920',
    type: '60d5f1d4cdc8942dc5b6b12e',
    otherFields: 'about 10 - removed for clarity'
  },
  {
    _id: '60d5f389d93fb82ebe84d926',
    type: '60d5f1d4cdc8942dc5b6b12e',
    otherFields: 'ditto'
  },
  {
    _id: '60d5f39bd93fb82ebe84d92c',
    type: '60d5f1e3cdc8942dc5b6b138',
    otherFields: 'foobarbarfoo'
  }
]

我有一个这样的查找表...

const lookupTable = [
  { _id: '60d5f1d4cdc8942dc5b6b12e', type: 'duck' },
  { _id: '60d5f1decdc8942dc5b6b133', type: 'goose' },
  { _id: '60d5f1e3cdc8942dc5b6b138', type: 'crane' },
  { _id: '60d5f1e9cdc8942dc5b6b13d', type: 'heron' }
]

如何创建这样的汇总表?

[
  { name: 'duck', data: [2] },
  { name: 'crane', data: [1] }
]

生成的表结构有点奇怪(具有单值数组的数据),但我们需要这种结构用于 Apex 图表。

任何帮助都会很棒,谢谢。

1 个答案:

答案 0 :(得分:1)

有多种方法可以做到这一点,但基本逻辑是做一个 groupBy 并与查找表匹配。使用 lodash 或辅助库会更容易。而且不使用 JS 也可以很容易地完成。

您可以使用此快速解决方案:

//Group by type and then storing the count
const grouped = allObs.reduce((p, c) => {
    p[c.type] = p[c.type] || 0;
    p[c.type] += 1;
    return p;
}, {});

// putting that into a result array.
const result = lookupTable
    .filter(entry=>grouped[entry._id]) //filtering whatever is not there
    .map(entry => {
        return { name: entry.type, data: [grouped[entry._id]] }
    });

您可以使用旧的 for 循环一次性完成。

输出:

[ { name: 'duck', data: [ 2 ] }, { name: 'crane', data: [ 1 ] } ]