在聚合日期字段MongoDB上移动窗口操作

时间:2018-02-05 15:27:16

标签: mongodb aggregation timedelta

所以,我正在使用 mongodb 3.6.0驱动程序

运行此命令后,我有一个结果集合:

db.commands.aggregate([{$project: { _id:0 ,user: 1, purchaseDate: 1}},{$sort: {user: 1, purchaseDate: 1}}],{allowDiskUse: true})

看起来像这样:

{ "user" : "1", "purchaseDate" : ISODate("2015-03-09T00:18:38") }
{ "user" : "1", "purchaseDate" : ISODate("2015-03-09T09:44:09") }
{ "user" : "1", "purchaseDate" : ISODate("2015-03-09T09:44:11") }
{ "user" : "2", "purchaseDate" : ISODate("2015-03-09T09:15:57") }
{ "user" : "2", "purchaseDate" : ISODate("2015-03-09T11:32:22") }
{ "user" : "3", "purchaseDate" : ISODate("2015-03-09T13:40:15") }
{ "user" : "4", "purchaseDate" : ISODate("2015-03-09T04:18:57") }
{ "user" : "5", "purchaseDate" : ISODate("2015-03-09T14:46:52") }
{ "user" : "6", "purchaseDate" : ISODate("2015-03-09T16:51:19") }
{ "user" : "7", "purchaseDate" : ISODate("2015-03-09T09:37:53") }
{ "user" : "8", "purchaseDate" : ISODate("2015-03-09T16:25:25") }
{ "user" : "8", "purchaseDate" : ISODate("2015-03-09T16:26:20") }
{ "user" : "8", "purchaseDate" : ISODate("2015-03-09T17:12:57") }

我想计算两次购买同一用户之间经过的时间(以秒或分钟为单位)。使每个文档看起来像这样:

{ "user" : "1", "purchaseDate" : ISODate("2015-03-09T00:18:38"), "delta_seconds": 0 }
{ "user" : "1", "purchaseDate" : ISODate("2015-03-09T09:44:09"), "delta_seconds": 33931 }
{ "user" : "1", "purchaseDate" : ISODate("2015-03-09T09:44:11"), "delta_seconds": 2 }
{ "user" : "2", "purchaseDate" : ISODate("2015-03-09T09:15:57"), "delta_seconds": 0 }
{ "user" : "2", "purchaseDate" : ISODate("2015-03-09T11:32:22"), "delta_seconds":  6491}

...
and so on.

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试以下聚合:

import { SuperTabsController } from 'ionic2-super-tabs';

基本上,要在聚合框架中获取其他文档的上下文,您需要将它们分组到一个数组中。因此,在第二阶段之后,我们最终得到每个用户的所有日期数组。我们还添加了人工数组export class rootPage1 { constructor(private superTabsCtrl: SuperTabsController){} ionViewWillLeave() { this.superTabsCtrl.showToolbar(false); } ionViewWillEnter() { this.superTabsCtrl.showToolbar(true); } } ,因为我想利用$unwind提供数组索引(db.purchases.aggregate([ { $sort: { purchaseDate: 1 } }, { $group: { _id: "$user", purchaseDate: { $push: "$purchaseDate" }, propertyToUnwind: { $push: 1 } } }, { $unwind: { path: "$propertyToUnwind", includeArrayIndex: "index" } }, { $project: { user: "$_id", delta_miliseconds: { $cond: { if: { $eq: [ "$index", 0 ] }, then: 0, else: { $subtract: [ { $arrayElemAt: [ "$purchaseDate", "$index" ] }, { $arrayElemAt: [ "$purchaseDate", { $subtract: [ "$index", 1 ] } ] } ] } } } } }, { $project: { user: 1, delta_seconds: { $divide: [ "$delta_miliseconds", 1000 ] } } }, { $sort: { user: 1 } } ]) 选项)的事实。

有了这个索引,我们可以轻松地减去两个日期(从当前索引和前一个索引)。如果当前处理的文档的索引等于零,我们可以返回零,因为之前没有(这就是为什么在这里使用$cond)。日期的$subtract返回毫秒数,因此我们需要将此字段除以1000以获得秒数。