mongodb汇总$ match带有先前数据的循环

问题描述 投票:0回答:1
Order.aggregate()
      .match({ createdAt: dateRange })
      .lookup({
        as: 'userData',
        foreignField: '_id',
        from: 'users',
        localField: 'user',
      })
      .unwind('$userData')
      .lookup({
        as: 'referrals',
        foreignField: 'referredBy',
        from: 'users',
        localField: 'user',
      })
      .unwind('$referrals')
      .project({
        _id: 0,
        companyName: '$userData.companyName',
        fullName: '$userData.fullName',
        invoiceNumber: 1,
        orderNumber: 1,
        price: 1,
        referrals: '$referrals._id',
        user: 1,
      })
      .group({
        _id: '$user',
        companyName: { $first: '$companyName' },
        fullName: { $first: '$fullName' },
        invoiceNumber: { $first: '$orderNumber' },
        referrals: { $addToSet: '$referrals' },
        total: { $sum: '$price' },
      })
      .match({
        $or: '$referrals'.map(user => ({ user })),
        createdAt: dateRange,
      });

我只想遍历$ referrals数组。但收到错误消息:

“ $ referrals” .map不是一个函数

是否有任何解决方法?

而且,我是MongoDB的初学者,这是获取数据的最佳方法吗?我想要的数据:

假设用户是mr.foo

  • 查找日期范围内的所有订单,计算总数,将第一个订单号作为发票号,

  • 从Users集合中获取mr.foo数据,

  • 找到所有mr.foo推荐用户-(在referredBy字段中具有mr.foo id的用户)

  • 查找所有推荐订单,并计算推荐总费用

  • 从推荐人的总账单中计算mr.foo的佣金。

输出。

javascript node.js mongodb mongoose
1个回答
0
投票
Order.aggregate()
      .match({ createdAt: dateRange })
      .lookup({
        as: 'userData',
        foreignField: '_id',
        from: 'users',
        localField: 'user',
      })
      .unwind('$userData')
      .lookup({
        as: 'referrals',
        foreignField: 'referredBy',
        from: 'users',
        localField: 'user',
      })
      .unwind('$referrals')
      .project({
        _id: 0,
        companyName: '$userData.companyName',
        fullName: '$userData.fullName',
        invoiceNumber: 1,
        orderNumber: 1,
        price: 1,
        referrals: { user: '$referrals._id' }, // changing this to object worked!
        user: 1,
      })
      .group({
        _id: '$user',
        companyName: { $first: '$companyName' },
        fullName: { $first: '$fullName' },
        invoiceNumber: { $first: '$orderNumber' },
        referrals: { $addToSet: '$referrals' },
        total: { $sum: '$price' },
      })
      .match({
        $or: '$referrals',
        createdAt: dateRange,
      });

我仍在寻找实现此目的的最佳方法。

© www.soinside.com 2019 - 2024. All rights reserved.