比较mongodb中单个集合中的文档
以下名为“IgnitionData”的集合在mongodb中维护。这里我只展示文件的相关成员比较mongodb中单个集合中的文档,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,以下名为“IgnitionData”的集合在mongodb中维护。这里我只展示文件的相关成员 data: {[ {"_id":1, "ignition": 0,"date" : ISODate("2014-03-01T09:00:00Z")}, {"_id":2, "ignition": 1,"date" : ISODate("2014-03-01T09:01:00Z")}, {"_id":3, "ignition": 1,"date" : ISODate("201
data: {[
{"_id":1, "ignition": 0,"date" : ISODate("2014-03-01T09:00:00Z")},
{"_id":2, "ignition": 1,"date" : ISODate("2014-03-01T09:01:00Z")},
{"_id":3, "ignition": 1,"date" : ISODate("2014-03-01T09:02:00Z")},
{"_id":4, "ignition": 1,"date" : ISODate("2014-04-01T09:03:00Z")},
{"_id":5, "ignition": 1,"date" : ISODate("2014-04-01T09:04:00Z")},
{"_id":6, "ignition": 0,"date" : ISODate("2014-04-01T09:05:00Z")},
{"_id":7, "ignition": 1,"date" : ISODate("2014-03-01T09:06:00Z")},
{"_id":8, "ignition": 1,"date" : ISODate("2014-03-01T09:07:00Z")},
{"_id":9, "ignition": 1,"date" : ISODate("2014-03-01T09:08:00Z")},
{"_id":10, "ignition": 1,"date" : ISODate("2014-04-01T09:09:00Z")},
{"_id":11, "ignition": 1,"date" : ISODate("2014-04-01T09:10:00Z")},
{"_id":12, "ignition": 0,"date" : ISODate("2014-04-01T09:11:00Z")}
}]
现在我需要生成一个报告,其中我只需要显示点火持续时间。我的输出应该如下所示
{
{"_id":1, "StartTime": ISODate("2014-03-01T09:01:00Z"), "StopTime": ISODate("2014-03-01T09:04:00Z"), "totalDurationInMin" : 3},
{"_id":2, "StartTime": ISODate("2014-03-01T09:06:00Z"), "StopTime": ISODate("2014-03-01T09:10:00Z"), "totalDurationInMin" : 4}
}
我可以获取任何列表变量的数据并运行循环。检查点火状态的转换(0到1和1到0)并计算总时间,但如果可能,使用mongodb查询运算符将非常有用。有时会有很多文档,所以使用变量将是代价高昂的操作
可能的方法
var mapFunction = function(){ for( var i = 0; i < this.data.length; i++){
if ((this.data[i].ignition == "0") && (this.data[i+1].ignition == "1"))
{emit({StartDate: this.data[i].date});}
if ((this.data[i].ignition == "1" ) && (this.data[i+1].ignition == "0"))
{emit({EndDate: this.data[i].date});}
}};
var reduceFunction = function(key, values) { return values[1] - values[0]};
db.runCommand(
{
mapReduce: ignitionData,
map: mapFunction,
reduce: reduceFunction,
out: { merge: stoppageTime }
}
)
var-mapFunction=function(){for(var i=0;i
我仍然没有得到正确的答案。有人请帮忙。我想你可以在收藏中尝试mongodb聚合。 首先根据id和日期对集合进行排序,然后应用分组逻辑。类似于此:
db.IgnitionData.aggregate(
[
{$sort:{点火:1,日期:1}},
{
$group:
{
_id:“$\u id”,
开始时间:{$first:$date},
停止时间:{$last:$date}
}
}
]
)
我认为您可以在集合上尝试mongodb聚合。
首先根据id和日期对集合进行排序,然后应用分组逻辑。类似于此:
db.IgnitionData.aggregate(
[
{$sort:{点火:1,日期:1}},
{
$group:
{
_id:“$\u id”,
开始时间:{$first:$date},
停止时间:{$last:$date}
}
}
]
)
大家好,欢迎来到Stack Overflow。我可以问你一个关于数据结构的问题吗?看起来点火数据子文档适合于,但您将它们包含在父文档中。这是故意的吗?对不起,文斯,这是错误的,那些是个人文件。或者,即使我有子文档,我也会使用$unwind并单独创建。好的,谢谢。你能回答这个问题吗?先把开头和结尾的括号去掉,说清楚一点?嗨,文斯,现在完成了。。我的请求有任何更新吗?你好,ManasP,欢迎来到Stack Overflow。我可以问你一个关于数据结构的问题吗?看起来点火数据子文档适合于,但您将它们包含在父文档中。这是故意的吗?对不起,文斯,这是错误的,那些是个人文件。或者,即使我有子文档,我也会使用$unwind并单独创建。好的,谢谢。你能回答这个问题吗?先把开头和结尾的括号去掉,说清楚一点?嗨,文斯,现在完成了。。我的请求有任何更新吗?我尝试了你的答案,但没有给出想要的答案。我需要一个查询,可以检测从0->1到1->0的转换。我想捕捉这些事件。然后扣除这两个事件之间的时间。我尝试了你的答案,但没有给出想要的答案。我需要一个查询,可以检测从0->1到1->0的转换。我想捕捉这些事件。然后扣除这两个事件之间的时间。