我正在尝试使用MongoDB(v.3.2.11)聚合框架来处理一些类似以下格式的日志文档:
{
"_id" : ObjectId("58b753c6d4421f00216de942"),
"session_id" : "7CB8725A-3994-45B8-9CA2-92FC19406288",
"event_type" : "connect_begin",
"timestamp" : "1488409541.674997",
"user_id" : "f6830aac-60be-44df-9fa7-7aa530d637ce",
"u_at" : ISODate("2017-03-01T23:05:42.077Z"),
"c_at" : ISODate("2017-03-01T23:05:42.077Z")
}
我的收藏包含以上共享一个
session_id
的日志对,一个是begin
事件的日志,另一个是end
事件的日志。最终目标是通过时间戳之间的差异来计算这些会话的长度。到目前为止,我已经能够编写一个聚合管道,按
$session_id
将日志分组,并提供与会话相关联的两个$events
数组。我的想法是接下来我将使用$cond
检查数组中每个$event
的event_type
,这将告诉我它是begin
还是end
事件,并将开始和结束时间戳投影到最终结果上。我已经粘贴了我目前为止的内容如下:db.time_spent_logs.aggregate([
{ $group: {
_id: '$session_id',
events: {
$push: {
event_type: '$event_type',
timestamp: '$timestamp'
}
}
}},
{ $project: {
start: {
$cond: {
if: { $or: [ { $strcasecmp: [ "$events[0].event_type", "trending_begin" ]}, { $strcasecmp: [ "$events[0].event_type", "connect_begin" ]}] },
then: '$events[0].timestamp',
else: '$events[1].timestamp'
}
},
end: {
$cond: {
if: { $or: [ { $strcasecmp: [ "$events[0].event_type", "trending_end" ]}, { $strcasecmp: [ "$events[0].event_type", "connect_end" ]}] },
then: '$events[0].timestamp',
else: '$events[1].timestamp'
}
}
}}
])
这将生成以下列表:
{ "_id" : "4EC4B831-D3C7-49C6-9EC8-301981639ED7" }
我认为我的问题出现在我的$cond的if语句中,在这个if语句中,我正在比较每个$event的event_type字段的值与一个字符串,以查看它是否为我们的两种begin或end事件类型之一。我相信我的问题就出现在这里的$if $or $strcasecompare中,可能是某些地方写错了...
我已经尝试使用$literal来进行event_type的比较,但没有结果。
非常感谢任何帮助!
[]
来索引数组元素。话虽如此,您能告诉我们您正在运行的mongod
版本吗?您的查询预期输出是什么? - styvane