首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将facet聚合输出到true key:value json?

如何将facet聚合输出到true key:value json?
EN

Stack Overflow用户
提问于 2019-02-02 09:44:32
回答 1查看 149关注 0票数 1

我编写了一个脚本来聚合一些数据,但是输出不是真正的json。

我试图修改聚合管道的$project部分,但我认为我做得不对。

代码语言:javascript
复制
    pipeline = [
        {
            "$match": {
                "manu": {"$ne": "randomized"},
            }},
        {
            "$match": {
                "rssi": {"$lt": "-65db"}
            }
        },
        {"$sort": {"time": -1}},
        {
            "$group": {"_id": "$mac",
                       "lastSeen": {"$first": "$time"},
                       "firstSeen": {"$last": "$time"},
                       }
        },

        {
            "$project":
            {
                "_id": 1,
                "lastSeen": 1,
                "firstSeen": 1,
                "minutes":
                {
                    "$trunc":
                    {
                        "$divide": [{"$subtract": ["$lastSeen", "$firstSeen"]}, 60000]
                    }
                },

            }
        },

        {
            "$facet": {
                "0-5": [
                    {"$match": {"minutes": {"$gte": 1, "$lte": 5}}},
                    {"$count": "0-5"},
                ],
                "5-10": [
                    {"$match": {"minutes": {"$gte": 5, "$lte": 10}}},
                    {"$count": "5-10"},
                ],
                "10-20": [
                    {"$match": {"minutes": {"$gte": 10, "$lte": 20}}},
                    {"$count": "10-20"},
                ],
            }
        },
        {"$project": {
            "0-5": {"$arrayElemAt": ["$0-5.0-5", 0]},
            "5-10": {"$arrayElemAt": ["$5-10.5-10", 0]},
            "10-20": {"$arrayElemAt": ["$10-20.10-20", 0]},

        }},

        {"$sort": SON([("_id", -1)])}

    ]

    data = list(collection.aggregate(pipeline, allowDiskUse=True))

因此,我基本上以{'0-5': 2914, '5-10': 1384, '10-20': 1295}的形式获得输出--它不能用于迭代。

理想情况下应该是

代码语言:javascript
复制
{'timeframe': '0-5', 'count': 262}

有什么建议吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-02 10:39:56

您可以尝试在聚合下面(替换当前的$facet和以下阶段):

代码语言:javascript
复制
db.col.aggregate([{
    "$facet": {
            "0-5": [
                {"$match": {"minutes": {"$gte": 1, "$lte": 5}}},
                {"$count": "total"},
            ],
            "5-10": [
                {"$match": {"minutes": {"$gte": 5, "$lte": 10}}},
                {"$count": "total"},
            ],
            "10-20": [
                {"$match": {"minutes": {"$gte": 10, "$lte": 20}}},
                {"$count": "total"},
            ]
        },
    },
    {
        $project: {
            result: { $objectToArray: "$$ROOT" }
        }
    },
    {
        $unwind: "$result"
    },
    {
        $unwind: "$result.v"
    },
    {
        $project: {
            timeframe: "$result.k",
            count: "$result.v.total"
        }
    }
])

$facet返回包含三个字段(子聚合的结果)的单个文档。您可以使用$objectToArraykv字段的形式获取它,然后使用$unwind获取每个键的单个文档。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54491822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档