如何在MongoDB中聚合类似的对象?

如何在MongoDB中聚合类似的对象?,mongodb,Mongodb,鉴于以下样本数据: { "_id" : ObjectId("528f6325bc0cb945ffbfd7d2"), "Value1" : 297138463, "hostname" : "server1", "time" : 1385128741.221214 } { "_id" : ObjectId("528f6325bc0cb945ffbfd7d3"), "Value1" : 312283635, "hostname" : "server2", "time" : 1385128741.243

鉴于以下样本数据:

{ "_id" : ObjectId("528f6325bc0cb945ffbfd7d2"), "Value1" : 297138463, "hostname" : "server1", "time" : 1385128741.221214 }
{ "_id" : ObjectId("528f6325bc0cb945ffbfd7d3"), "Value1" : 312283635, "hostname" : "server2", "time" : 1385128741.24351 }
{ "_id" : ObjectId("528f6325bc0cb945ffbfd7d4"), "Value1" : 277946406, "hostname" : "server3", "time" : 1385128741.249723 }
{ "_id" : ObjectId("528f6325bc0cb945ffbfd7d5"), "Value1" : 300892042, "hostname" : "server4", "time" : 1385128741.255984 }
{ "_id" : ObjectId("528f6325bc0cb945ffbfd7d6"), "Value1" : 294501471, "hostname" : "server5", "time" : 1385128741.263583 }
{ "_id" : ObjectId("528f6361bc0cb947df5ff960"), "Value1" : 297187182, "hostname" : "server1", "time" : 1385128801.826883 }
{ "_id" : ObjectId("528f6361bc0cb947df5ff961"), "Value1" : 312331528, "hostname" : "server2", "time" : 1385128801.848045 }
{ "_id" : ObjectId("528f6361bc0cb947df5ff962"), "Value1" : 277987001, "hostname" : "server3", "time" : 1385128801.857552 }
{ "_id" : ObjectId("528f6361bc0cb947df5ff963"), "Value1" : 300924710, "hostname" : "server4", "time" : 1385128801.864611 }
{ "_id" : ObjectId("528f6361bc0cb947df5ff964"), "Value1" : 294528575, "hostname" : "server5", "time" : 1385128801.8726 }
{ "_id" : ObjectId("528f639ebc0cb949ef5db1d4"), "Value1" : 297212963, "hostname" : "server1", "time" : 1385128862.060666 }
{ "_id" : ObjectId("528f639ebc0cb949ef5db1d5"), "Value1" : 312371013, "hostname" : "server2", "time" : 1385128862.083595 }
{ "_id" : ObjectId("528f639ebc0cb949ef5db1d6"), "Value1" : 278014257, "hostname" : "server3", "time" : 1385128862.089885 }
{ "_id" : ObjectId("528f639ebc0cb949ef5db1d7"), "Value1" : 300952539, "hostname" : "server4", "time" : 1385128862.095612 }
{ "_id" : ObjectId("528f639ebc0cb949ef5db1d8"), "Value1" : 294572376, "hostname" : "server5", "time" : 1385128862.103005 }
{ "_id" : ObjectId("528f63d9bc0cb94bc1e8eedd"), "Value1" : 297243502, "hostname" : "server1", "time" : 1385128921.73372 }
{ "_id" : ObjectId("528f63d9bc0cb94bc1e8eede"), "Value1" : 312406080, "hostname" : "server2", "time" : 1385128921.755981 }
{ "_id" : ObjectId("528f63d9bc0cb94bc1e8eedf"), "Value1" : 278041965, "hostname" : "server3", "time" : 1385128921.762048 }
{ "_id" : ObjectId("528f63d9bc0cb94bc1e8eee0"), "Value1" : 301007401, "hostname" : "server4", "time" : 1385128921.767804 }
{ "_id" : ObjectId("528f63d9bc0cb94bc1e8eee1"), "Value1" : 294599791, "hostname" : "server5", "time" : 1385128921.775356 }

我想为彼此相隔一秒钟内发生的所有对象聚合
Value1
。这可能吗<代码>时间是自历元起的UTC秒数。

如果您希望在同一秒内查找所有事件,这将起作用,假设集合名为事件:

db.events.group({
    $keyf: function (event) {
        return {
            seconds: Math.round(event.time)
        };
    },
    initial: {
        events: []
    },
    $reduce: function (event, result) {
        result.events.push(event);
    }
});
  • $keyf-用于从函数而不是现有字段创建键,使用它将时间舍入/截断为秒
  • 初始-在同一秒内为每组记录创建初始精简文档
  • $reduce将每个事件对象推送到分组结果中
  • 有关更多选项,请参阅文档
如果“合计”是指总和,那么请改为:

db.events.group({
    $keyf: function (event) {
        return {
            seconds: Math.round(event.time)
        };
    },
    initial: {
        total: 0
    },
    $reduce: function (event, result) {
        result.total += event.Value1;
    }
});

您不能在MongoDB聚合中进行跨文档比较,这听起来是您需要的?我认为如果可能的话,在聚合中很难做到这一点,即,如果您有三个文档相隔1秒,您如何聚合它们?您需要聚合之外的自定义逻辑,所以最好只向我想要分组的对象添加某种类型的“会话”id?或者我应该在数据收集过程中进行聚合并将数据存储在一起?出于某种原因,第二种选择似乎是错误的。