Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用mongodb聚合?_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

如何使用mongodb聚合?

如何使用mongodb聚合?,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有这样的收藏: {'speed':45, 'time':1446271000}, {'speed':45, 'time':1446271001}, {'speed':63, 'time':1446271002}, {'speed':68, 'time':1446271003}, {'speed':70, 'time':1446271004}, {'speed':59, 'time':1446271005}, {'speed':55, 'time':1446

我有这样的收藏:

{'speed':45, 'time':1446271000},   
{'speed':45, 'time':1446271001},   
{'speed':63, 'time':1446271002},    
{'speed':68, 'time':1446271003},  
{'speed':70, 'time':1446271004},    
{'speed':59, 'time':1446271005},   
{'speed':55, 'time':1446271006},    
{'speed':61, 'time':1446271007},    
{'speed':62, 'time':1446271008},   
{'speed':63, 'time':1446271009},    
{'speed':67, 'time':1446271010}   
我想总结一下高速(速度>=60)记录,因此结果应该如下所示:

{'speed':63,'duration':2,'start': 1446271002,'end': 1446271004}  
{'speed':61,'duration':3,'start': 1446271007,'end': 1446271010}

我应该如何实现这一点?

使用以下聚合管道进行初始筛选,筛选出小于60的文档

下一个管道步骤使用操作符按下一步骤所需的时间字段重新排序文档,即管道。在这里,您可以通过使用累加器操作符导出开始和结束字段,当您将文档按速度字段分组为键时,累加器操作符提取第一次和最后一次

最后一个管道步骤使用算术运算符创建附加字段duration,顾名思义,它从
结束时间中减去
开始时间。最终的管道将如下所示:

db.test.aggregate([
    { "$match": { "speed": { "$gte": 60 } } },
    { "$sort": { "time": 1 }  },
    {
        "$group": {
            "_id": "$speed",
            "start": { "$first": "$time" },
            "end": { "$last": "$time" }
        }
    },
    {
        "$project": {
            "_id": 0,
            "speed": "$_id",
            "duration": { "$subtract": [ "$end", "$start" ] },
            "start": 1,
            "end": 1
        }
    }
])
样本输出:

/* 0 */
{
    "result" : [ 
        {
            "start" : 1446271010,
            "end" : 1446271010,
            "speed" : 67,
            "duration" : 0
        }, 
        {
            "start" : 1446271007,
            "end" : 1446271007,
            "speed" : 61,
            "duration" : 0
        }, 
        {
            "start" : 1446271008,
            "end" : 1446271008,
            "speed" : 62,
            "duration" : 0
        }, 
        {
            "start" : 1446271004,
            "end" : 1446271004,
            "speed" : 70,
            "duration" : 0
        }, 
        {
            "start" : 1446271003,
            "end" : 1446271003,
            "speed" : 68,
            "duration" : 0
        }, 
        {
            "start" : 1446271002,
            "end" : 1446271009,
            "speed" : 63,
            "duration" : 7
        }
    ],
    "ok" : 1
}

我之所以发布这篇文章,是因为现有的答案为管道添加了不必要的阶段,这将导致性能下降

您需要使用运算符筛选出集合中的所有文档,其中
speed
为60,然后使用“speed”筛选文档,并使用和累加器运算符分别返回不同组的“time”的最小值和最大值。从这里开始,您需要使用操作符计算到“持续时间”的其他离子阶段。当然,该方法提供了对的访问

db.collection.aggregate([
{“$match”:{
“速度”:{“$gte”:60}
}}, 
{“$group”:{
“_id”:“$speed”,
“期限”:{“$sum”:1},
“开始”:{“$min”:“$time”},
“结束”:{“$max”:“$time”}
}},
{“$project”:{
“速度”:“$\u id”,
“_id”:0,
“持续时间”:{“$subtract”:[“$end”,“$start”]},
“开始”:1,
“结束”:1
}} 
])
其收益率为:

{“开始”:1446271010,“结束”:1446271010,“速度”:67,“持续时间”:0}
{“开始”:1446271008,“结束”:1446271008,“速度”:62,“持续时间”:0}
{“开始”:1446271007,“结束”:1446271007,“速度”:61,“持续时间”:0}
{“开始”:1446271004,“结束”:1446271004,“速度”:70,“持续时间”:0}
{“开始”:1446271003,“结束”:1446271003,“速度”:68,“持续时间”:0}
{“开始”:1446271002,“结束”:1446271009,“速度”:63,“持续时间”:7}

添加$sort stage后,它将非常完美。是否希望按开始时间对结果进行排序?