Mongoose 猫鼬集团;有条件地求和

Mongoose 猫鼬集团;有条件地求和,mongoose,Mongoose,我已经为这个问题挣扎了一整天,所以我现在带着它来找你 我有一套产品定义如下: //产品架构 { 品牌:String, 大小:字符串, 颜色:细绳, ... } 我正在使用以下过滤器查找同一品牌的所有商品: //标准筛选搜索 常数匹配={ 品牌:“品牌1” } Product.find(匹配) 它返回两个结果: //结果集 {品牌:'brand1',尺寸:'M',颜色:'RED',…}, {品牌:'brand1',尺寸:'S',颜色:'GREEN',…} 现在谈谈我面临的问题: 我想为每个过

我已经为这个问题挣扎了一整天,所以我现在带着它来找你

我有一套产品定义如下:

//产品架构
{
品牌:String,
大小:字符串,
颜色:细绳,
...
}
我正在使用以下过滤器查找同一品牌的所有商品:

//标准筛选搜索
常数匹配={
品牌:“品牌1”
}
Product.find(匹配)
它返回两个结果:

//结果集
{品牌:'brand1',尺寸:'M',颜色:'RED',…},
{品牌:'brand1',尺寸:'S',颜色:'GREEN',…}
现在谈谈我面临的问题:
我想为每个过滤器(品牌、尺寸、颜色等)列出一个可能的分组值列表(红色、绿色、M、S、brand1、brand2等),以及它们在实际过滤结果集中的相应总和。
我不知道如何正确地解释它,但以下是我想要的结果:

[{
“品牌”:[
{
“_id”:“brand1”,
“计数”:2
}, {
“_id”:“brand2”,
“计数”:0
}, {
“_id”:“brand3”,
“计数”:0
}
],
“尺寸”:[
{
“_id”:“M”,
“计数”:1
}, {
“_id”:“S”,
“计数”:1
}, {
“_id”:“L”,
“计数”:0
}
],
“颜色”:[
{
“_id”:“红色”,
“计数”:1
}, {
“_id”:“绿色”,
“计数”:1
}, {
“_id”:“橙色”,
“计数”:0
}
],
}]
我尝试的 我通过下面的聚合查询获得了这个结构;它对所有键进行分组,但对它们进行汇总,表示全局数据库,而不是经过筛选的数据库。如果我在$facet之前添加一个{$match:…},它将只对过滤器的可用键进行分组,并忽略应该归零的键

//不起作用:将忽略总和为0的所有键
产品.骨料([
{ 
$facet:{
品牌:[{$sortByCount:$brand}],
大小:[{$sortByCount:$size}],
颜色:[{$sortByCount:$color}],
...
}
}    
])
//不起作用:所有键都存在,但总和不正确
产品.骨料([
{
$match:{品牌:“品牌1”}
},
{ 
$facet:{
品牌:[{$sortByCount:$brand}],
大小:[{$sortByCount:$size}],
颜色:[{$sortByCount:$color}],
...
}
}    
])
我希望这是清楚的,我尽我所能解释我的问题,如果有人能提出一个想法,我会很高兴:)

如果您需要更多信息,请直接询问。

  • $set
    要创建类似于
    searchBrand
    的字段,请检查您的条件,如果brand是您的搜索分支,然后将其设置为1,否则为0
  • $group
    按方面中的特定字段,并计算
    搜索品牌
    字段
  • $sort
    计数
    降序排列

它工作正常。请参阅“正在工作”中的一些不清楚的内容:我执行此搜索:然后我想返回聚合过滤器。所发生的事情是,我可以返回带有查找或原始的计数和组的筛选器。但我无法将所有原始项目分组,而只能计算查找中的一项。。。很难解释。。。我会想办法更好地解释…我们怎么才能理解你的东西可能不清楚呢?Sry我误按了enter,没有完成我的消息…我想,以你的游乐场为例,brand2的cout为0(因为它不包括在搜索输出中,我只搜索brand1项)哦,似乎是这样。我今天下午看了一下,如果一切都好,我就接受。太多了!很好,我测试过了,效果很好!谢谢。我现在将调整搜索条件以匹配我的全局搜索。但是,能够在一个且唯一的查询中包含所有这些信息是非常棒的:)
db.collection.aggregate([
  {
    $set: {
      searchBrand: {
        $cond: [{ $eq: ["$brand", "brand1"] }, 1, 0]
      }
    }
  },
  {
    $facet: {
      brand: [
        {
          $group: {
            _id: "$brand",
            count: { $sum: "$searchBrand" }
          }
        },
        { $sort: { count: -1 } }
      ],
      size: [
        {
          $group: {
            _id: "$size",
            count: { $sum: "$searchBrand" }
          }
        },
        { $sort: { count: -1 } }
      ],
      colour: [
        {
          $group: {
            _id: "$colour",
            count: { $sum: "$searchBrand" }
          }
        },
        { $sort: { count: -1 } }
      ]
    }
  }
])