【问题标题】:$lookup on object array with table$lookup 使用表查找对象数组
【发布时间】:2021-01-21 05:41:08
【问题描述】:

我有包含数组的数据对象。我有提供者表。

  1. 如果数组的 ID 应该等于提供者的表 ID Id == id

  2. 如果id重复,则重复计数为membersCounts否则membersCounts = 0

  3. 用数据对象添加membersCounts

数据对象

const data = {
  Milk: [
    {
      Id: 1,
      name: 'a'
    },
    {
      Id: 2,
      name: 'b'
    },
    {
      Id: 3,
      name: 'c'
    },
    {
      Id: 4,
      name: 'd'
    },
    {
      Id: 52,
      name: 'e'
    }
  ],
  Grocery: [
    {
      Id: 8,
      name: '2a'
    },
    {
      Id: 22,
      name: '2b'
    },
    {
      Id: 32,
      name: '2c'
    },
    {
      Id: 42,
      name: '2d'
    }
  ]
}

供应商表

const providers = [
  {
    id: 1,
    status: 'active'
  },
  {
    id: 1,
    status: 'active'
  },
  {
    id: 1,
    status: 'active'
  },
  {
    id: 1,
    status: 'active'
  },
  {
    id: 4,
    status: 'active'
  },
  {
    id: 2,
    status: 'active'
  },
  {
    id: 3,
    status: 'active'
  },
  {
    id: 3,
    status: 'active'
  },
  {
    id: 52,
    status: 'active'
  },
  {
    id: 1,
    status: 'active'
  }
]

这里是javascript代码

这段代码运行良好,但我想使用 mongodb 查询来执行此操作。所以说性能好。 可以使用 mongodb 查询。我需要将 javascript 代码转换为 mongodb 查询。

getMembersWithVendors(data, providers) {
    for (var key in data) {
      var arr = data[key]
      arr.forEach((element) => {
        element.memberCounts = 0
        element.new = true
        providers.map((el) => {
          if (element._id == el.vendorId) {
            (element.memberCounts = element.memberCounts + 1),
              (element.new = false)
          }
        })
      })
    }
    return data
  }

输出

{ Milk:
   [ { Id: 1, name: 'a', memberCounts: 5 },   
     { Id: 2, name: 'b', memberCounts: 1 },   
     { Id: 3, name: 'c', memberCounts: 2 },   
     { Id: 4, name: 'd', memberCounts: 1 },   
     { Id: 52, name: 'e', memberCounts: 1 } ],
  Grocery:
   [ { Id: 8, name: '2a', memberCounts: 0 },  
     { Id: 22, name: '2b', memberCounts: 0 },
     { Id: 32, name: '2c', memberCounts: 0 },
     { Id: 42, name: '2d', memberCounts: 0 } ] }

谢谢!!

【问题讨论】:

  • 发布数据在db中的存储方式
  • 大 json 文件
  • 发布模型和json中的少量数据

标签: node.js mongodb aggregation-framework lookup


【解决方案1】:

这段代码运行良好,但我想使用 mongodb 查询来执行此操作。这样性能就不错了

在查询中做所有的操作不是个好主意,它可能会导致性能问题,因为你的输入数据太大了,但是你可以改进一些东西,

  • $group 通过查询 id 并获取计数,这将返回唯一 ID 及其总数
let providers = await db.providers.aggregate([
  {
    $group: {
      _id: "$id",
      count: { $sum: 1 }
    }
  }
]);
  • 对象数组的迭代循环
  • 根据 id 从提供者处查找
  • 从过滤后的文档中获取计数
for (let key in data) {
    data[key].forEach(e => {
        let p = providers.find(p => p._id === e.Id);
        e.memberCounts = p ? p.count : 0;
    })
}

console.log(data);

Repl Playground

【讨论】:

  • Grocey 和 Milk 是动态字段。
  • 好的,如果可能的话,我会尝试尽快更新您。
  • 数据不是表格,它是我的输入对象
  • 哦,真奇怪,你不需要在查询中做所有操作你可以在nodejs端做一半,让我检查一下
  • 1.数据是对象 2。提供者是从提供者表中获取的记录。
猜你喜欢
  • 1970-01-01
  • 2020-07-21
  • 2017-02-07
  • 2018-11-30
  • 1970-01-01
  • 2017-12-13
  • 2016-04-30
相关资源
最近更新 更多