基于一个字段的输出的MongoDB计数

亚伦

假设我有以下数据集,

//listings collection

{
  "city": New York,
  "beds": 2,
  "build": concrete
}

{
  "city": New York,
  "beds": 4,
  "build": wood
}

{
  "city": New York,
  "beds": 3,
  "build": asphalt
}

{
  "city": New York,
  "beds": 1,
  "build": concrete
}

我可以通过以下查询获得以下平均床位数

        db.listings.aggregate(
            [  
                {  
                    $match: {  
                        "city": "New York"
                    }
                },
                {  
                    $group: {  
                        "_id": null,
                        "Avg-Beds": {  
                            $avg:"$beds
                         }
                    }
                }
            ])

这很酷,但我真正想要的是

{
    "Avg-Beds": 2
    "Build" {
                "Asphalt" : 1,
                "Wood": 1,
                "Concrete": 2

}

总之,我想平均床位,但我想同时计算"build"字段的输出这如何用 mongodb 实现?

更好的是类似于输出

"Build": {
           "Asphalt": "25%"
 }

这将给出基于百分比的值。请注意,我没有一组预定义的"build"输出字段。

米克尔

您可以尝试以下聚合:

db.listings.aggregate([
    {
        $match: { "city": "New York" }
    },
    {
        $group: {
            _id: null,
            avg: { $avg: "$beds" },
            docs: { $push: "$$ROOT" }
        }
    },
    {
        $unwind: "$docs"
    },
    {
        $group: {
            _id: "$docs.build",
            avg: { $first: "$avg" },
            beds: { $sum: "$docs.beds" }
        }
    },
    {
        $group: {
            _id: null,
            avg: { $first: "$avg" },
            total: { $sum: "$beds" },
            Build: { $push: { k: "$_id", v: "$beds" } }
        }
    },
    {
        $addFields: {
            Build: {
                $map: {
                    input: "$Build",
                    as: "b",
                    in: {
                        k: "$$b.k",
                        v: { $divide: [ "$$b.v", "$total" ] }
                    }
                }
            }
        }
    },
    {
        $project: {
            _id: 0,
            avg: 1,
            Build: { $arrayToObject: "$Build" }
        }
    }
])

问题是您需要多个独立的聚合,因此您可以执行第一个 ( $avg),然后将其结果嵌入到集合的每个文档中(将所有文档推送到docs字段并展开该字段)。然后你可以构建一个k-v的数组来应用$arrayToObject来表示百分比。

结果你会得到:

{ "avg" : 2.5, "Build" : { "asphalt" : 0.3, "wood" : 0.4, "concrete" : 0.3 } }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

mongodb基于另一个字段的计数值

SQL:基于另一个字段的值的条件字段输出

创建基于另一个字段的计数器

Spring Boot - Mongodb - 基于另一个字段的自动递增字段

一个字段基于另一个字段的求和

如何获得每个字段(按另一个字段)MongoDB的不同字段计数?

MongoDB - 基于另一个字段值的 $match

如何对齐最后一个字段的输出

MongoDB通过嵌套字段进行分组并按另一个字段进行计数

一个字段的Oracle SQL计数由另一个字段分组

从MongoDB中仅选择一个字段

mongoDB 只从聚合返回一个字段

mongodb $ inc数组中的一个字段

从 mongoDB 集合中删除一个字段

试图基于一个字段获取DateDiff并更新另一个字段

在Redux表单中基于另一个字段验证一个字段

将setFieldValue用于一个字段,基于另一个字段的值

MongoDB聚合获取字段的不同值和另一个字段的输出列表

如何按多个字段分组并获取另一个字段的计数

根据另一个字段的值在MongoDB中投影一个字段

MongoDB将ObjectId从一个字段移动到另一个字段

Mongodb在一个字段上查询取决于另一个字段

Mongodb 比较使用一个字段与对象数组中的另一个字段

基于其他字段的唯一值的 Qlik Sense 一个字段的总和

将命令的输出与另一个的最后一个字段合并

如何在MongoDB中将一个字段分组并汇总一个对象(保留输出结构)中的字段?

T SQL游标更新字段基于上一个字段

Gson:基于另一个字段的动态字段解析

基于Jackson中另一个字段值的条件字段要求?