Node.js $lookup在具有表的对象数组上

Node.js $lookup在具有表的对象数组上,node.js,mongodb,aggregation-framework,lookup,Node.js,Mongodb,Aggregation Framework,Lookup,我有一个包含数组的数据对象。我有一张桌子 如果数组的Id应该等于提供程序的表IdId==Id 如果重复id,则重复计数为memberscontselsemembersconts=0 添加带有数据对象的membersCounts 数据对象 const data = { Milk: [ { Id: 1, name: 'a' }, { Id: 2, name: 'b' }, { Id: 3,

我有一个包含数组的数据对象。我有一张桌子

  • 如果数组的Id应该等于提供程序的表Id
    Id==Id

  • 如果重复id,则重复计数为
    membersconts
    else
    membersconts=0

  • 添加带有数据对象的
    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'
        }
      ]
    }
    
    { 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 } ] }
    
    提供者表

    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代码

    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'
      }
    ]
    
    
    这段代码运行良好,但我希望使用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
      }
    
    输出

    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'
        }
      ]
    }
    
    { 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 } ] }
    
    谢谢

    这段代码运行良好,但我希望使用mongodb查询执行这项操作。因此,性能是好的

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

    • $group
      通过查询
      id
      并获取计数,这将返回唯一的id及其总计数
    • 对象数组的迭代循环
    • 根据id从提供程序中查找
    • 从筛选的文档中获取计数

    post数据是如何存储在dbLarge json filepost模型中的,jsonGrocey和Milk中的数据很少是动态字段。好的,如果可能的话,我会尝试尽快更新您。数据不是表,它是我的input对象哦,这很奇怪,您不需要在查询中完成所有操作,您可以在nodejs端完成一半,让我检查1。数据是对象2。提供程序从提供程序表中获取记录。