【问题标题】:mongodb count 每个对象的不同值的数量
【发布时间】:2022-01-08 10:14:10
【问题描述】:

您好,我正在为使用 MEAN 堆栈销售的产品创建一个新的 Web 应用程序,我想查看每个品牌(HP、ASUS ..)有多少台电脑有 8 Gb,有多少台电脑有 4 GB 等。 这是我的代码

exports.allcountProduct = async (req, res) => {
try {
    const count = await Product.aggregate(

            {
                "$group": {
                    "_id": {
                        $toLower: "$ram"
                    },
                    "count": { "$sum": 1 }
                }
            },
            {
                "$group": {
                    "_id": null,
                    "counts": { "$push": { "k": "$_id", "v": "$count" } }
                }
            },
            {
                "$replaceRoot": {
                    "newRoot": { "$arrayToObject": "$counts" }
                }
            },

        ],

    )

    res.json(count);
}

我得到的是:

 [
{
    "4GB": 20,
    "8GB": 15,
    "16GB": 32
}

]

所以我得到的是所有品牌的结果,而我试图得到的是每个品牌都像这样:

   [
{
    "brand": "ASUS",
    "8GB": 6,
    "16GB": 14
}

]

这是文档中的一个示例:

{
"_id":ObjectID( "617b0dbacda6cbd1a0403f68")
"brand": "6178524a5ff14e633aeff1ea",
"SerialNumber": "45454234324",
"ram": "4gb",
},
{
"_id":ObjectID( "617b0dbacda6cbd1a040345")
"brand": "6178524a5ff14e633aeff1ea",
"SerialNumber": "azazz5245454az",
"ram": "8gb",
},

【问题讨论】:

  • 如果您添加原始文档结构会有所帮助,因为不清楚品牌所在的位置...
  • @R2D2 { "_id":ObjectID( "617b0dbacda6cbd1a0403f68") "brand": "6178524a5ff14e633aeff1ea", "SerialNumber": "45454234324", "ram": "4gb", }, { "_id":ObjectID( "617b0dbacda6cbd1a040345") "brand": "6178524a5ff14e633aeff1ea", "SerialNumber": "azazz5245454az", "ram": "8gb", },

标签: node.js mongodb mongodb-query aggregation-framework aggregate-functions


【解决方案1】:

可能是这样的:

mongos> db.b.aggregate([
{$group:{ _id:{ r:"$ram" ,b:"$brand"}, cnt:{$sum:1} }}  ,
{$project:{ a:[{k:"$_id.r" ,v:"$cnt"}] , brand:"$_id.b" ,_id:0}   },
{$project:{d:{$arrayToObject:"$a"} ,brand:1 }  } ,
{$group:{ _id:"$brand", ram:{$push:"$d"}  }} ,
{$project:{_id:0,brand:"$_id" ,"options": { $mergeObjects: "$ram" } }},
{$replaceRoot: {  newRoot: { $mergeObjects: ["$$ROOT", "$options"] }}}, 
{$project:{options:0}}   ]).pretty()

{ "brand" : "6178524a5ff14e633aeff1ea", "8gb" : 1, "4gb" : 1 }
{ "brand" : "sony", "16gb" : 2, "8gb" : 1 }
mongos> 

解释:

  1. 按 ram 和品牌分组,因此我们计算每个品牌每个 ram 大小的数量
  2. 将 ram 类型和 ram 计数投影到适合下一阶段作为对象加入的 k & v
  3. 将 k,v 数组转换为对象
  4. 按品牌分组,以便我们可以列出每个 ram 大小和数量的列表
  5. 将具有 ram 类型/计数的数组切换为对象
  6. 将对象展平到根对象
  7. 根据我们的需要仅投影所需的字段

playground

【讨论】:

  • 谢谢它工作正常,但找不到解决方案来添加这样的总和尝试投影 $sum 但结果总是 0 我希望它看起来像这样 { "brand" : "sony", "16gb " : 2, "8gb" : 1, "sum" :3}
  • 我试过了,但在你的例子中它给出的错误总和相同,索尼总和应该是 2,但它是 3
  • 啊啊我的错误我误解了,以为你需要对象的总和......
  • 每次我想它都会给出最高的金额
猜你喜欢
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 2023-04-11
  • 2020-08-05
  • 2020-02-11
  • 2022-11-27
相关资源
最近更新 更多