所以,我正在使用 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.
任何人都可以帮助我吗?
答案 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以获得秒数。