最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

Mongo $ facet在聚合管道中获取并计算匹配产品的标签

IT培训 admin 3浏览 0评论

Mongo $ facet在聚合管道中获取并计算匹配产品的标签

我有这个聚合管道:

 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. 获取属于only的匹配产品的标签,并从包含$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
            }
          }
        }
      ],

Mongo $ facet在聚合管道中获取并计算匹配产品的标签

我有这个聚合管道:

 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. 获取属于only的匹配产品的标签,并从包含$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
            }
          }
        }
      ],

发布评论

评论列表 (0)

  1. 暂无评论