javascript - Mongo $facet 获取并统计聚合管道中匹配产品的标签

标签 javascript node.js mongodb mongoose

我有这个聚合管道:

 aggregate.lookup({
      from: 'tags',
      localField: 'tags',
      foreignField: '_id',
      as: 'tags'
    });

aggregate.match({
      productType: 'product',
      available: true,
      categories: {
        $elemMatch: {
          url: '/category/test'
        }
      }
    });

aggregate.facet({
      products: [
        { $sort: { [order]: sort } },
        { $skip: skip },
        { $limit: pageSize },
        {
          $project: {
            _id: 1,
            images: 1,
            onSale: 1,
            price: 1,
            quantity: 1,
            slug: 1,
            sale: 1,
            sku: 1,
            status: 1,
            title: 1,
            brand: 1,
            tags: 1
          }
        }
      ],
      tags: [
        { $unwind: '$tags' },
        {
          $group: {
            _id: {
              name: '$name.label',
              slug: '$slug'
            },
            count: {
              $sum: 1
            }
          }
        }
      ],
      range: [
        {
          $bucketAuto: {
            groupBy: '$price',
            buckets: 1,
            output: {
              min: { $min: '$price' },
              max: { $max: '$price' }
            }
          }
        }
      ],
      total: [{ $group: { _id: null, count: { $sum: 1 } } }]
    });

    aggregate.addFields({
      total: {
        $arrayElemAt: ['$total', 0]
      }
    });

    aggregate.addFields({
      range: {
        $arrayElemAt: ['$range', 0]
      }
    });


每个产品都有自己的标签,我不知道如何:

  1. 获取属于匹配产品的标签并从$facet返回一个数组包含
tags: [{name: 'tag1', slug: 'slug1', count: 10}, {name: 'tag2', slug: 'slug2', count: 5} ]

在哪里count: 10是带有标签的产品。

现在它返回数据库中找到的所有标签。

<罢工>2。为什么 range属性返回这样的对象:

"range": {
            "_id": {
                "min": 5.9,
                "max": 47
            },
            "min": 5.9,
            "max": 47
        }

而不是这样,因为我提供了一个 output $bucketAuto 中的对象:

"range": {
            "min": 5.9,
            "max": 47
        }

<罢工> 从 2 开始,这是 $bucketAuto 的正常 mongodb 行为.

最佳答案

这是我所做的并且有效:

就在$facet之前:

    aggregate.lookup({
      from: 'tags',
      let: { tags: '$tags' },
      pipeline: [
        {
          $match: {
            $expr: { $in: ['$_id', '$$tags'] }
          }
        }
      ],
      as: 'tags'
    });

然后在 $facet 中:

tags: [
        { $unwind: { path: '$tags' } },
        {
          $group: {
            _id: '$tags',
            count: {
              $sum: 1
            }
          }
        }
      ],

关于javascript - Mongo $facet 获取并统计聚合管道中匹配产品的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58336278/

相关文章:

javascript - 如何让websocket服务器位于路由器上?

javascript - 数据文本排序问题,colspan 单元格失败

node.js - Mongoose - 多个数据库连接

javascript - HTML 属性排序

javascript - 防止在谷歌电子表格中编辑单元格 - 谷歌文档脚本

javascript - 如何在同一个 return 语句中返回文本语句和函数输出?

mysql - 是否没有选项可以在 sequelize 模型中映射列名

node.js - Passport.authenticate 未按预期工作

javascript - 没有连接事件被触发 - Mongoose 4.7.1 & Express

node.js - MongoDB:查询结果匹配数组中的任意值