我在计算我的集合中的不同LogStatus时遇到问题。我想查询以下结果:
月| ImporterName | NrOfError | NrOfDebug | NrOfInfo | NrOfWarning
因此,这包括按月和ImporterName分组并计算具有不同状态的文档数。
My MongoDB Collection:
{
"_id" : "8ec84cb7-5099-4a9d-be00-a40200a67c5a",
"Messages" : [
{
"LogStatus" : "Error",
"Message" : "My test message"
},
{
"LogStatus" : "Error",
"Message" : "My test message"
},
{
"LogStatus" : "Error",
"Message" : "My test message"
},
{
"LogStatus" : "Error",
"Message" : "My test message"
},
{
"LogStatus" : "Error",
"Message" : "My test message"
}
],
"StartTime" : new Date("2014-12-15T10:06:09.00Z"),
"EndTime" : new Date("2014-12-15T13:06:09.00Z"),
"HasErrors" : true,
"HasWarnings" : false,
"ImporterName" : "MyImporter"
}
我已经有了以下查询:
db.SessionLogItems.aggregate
([
{
$project:
{
month :{$month : "$StartTime"},
name: "$ImporterName",
status: "$Messages.LogStatus",
_id: 0
}
}
])
结果:
月:12,"名称" :" importername",状态:["错误","错误","信息"]
和
db.SessionLogItems.aggregate
([
{
$unwind: "$Messages"
},
{
$group: { _id: "$Messages", Number : {$sum : 1 }}
},
{
$sort: {Number : -1 }
}
])
结果: " _id" :{" LogStatus" :"警告","消息" :"我的测试警告" }," Number" :5 " _id" :{" LogStatus" :"错误","消息" :"我的测试信息" }," Number" :5
但我似乎无法找出正确的查询。任何帮助表示赞赏!
编辑:
上面的例子只是众多文档中的一个。我有几个有startTime和EndTime的导入器。进口商有几个logmessages和四个可能的LogStatusses:"错误","信息","调试","警告"。我希望每个月和每个进口商都有一个概述他们产生了多少错误,信息,调试和警告。
答案 0 :(得分:1)
假设StartTime
和EndTime
值之间的“月份”没有重叠,那么您只需使用StartTime
值作为分组键的基础。其他“字段”的大部分魔力都来自$cond
运算符,它决定是否计算值:
db.SessionLogItems.aggregate([
// Unwind the array to de-normalize the documents contained
{ "$unwind": "$Messages" },
// Month and Importer form the grouping key
{ "$group": {
"_id": {
"month": { "$month": "$StartTime" },
"ImporterName": "$ImporterName"
},
"NrOfError": {
"$sum": {
"$cond": [
{ "$eq": [ "$Messages.LogStatus", "Error" ] },
1,
0
]
}
},
"NrOfDebug": {
"$sum": {
"$cond": [
{ "$eq": [ "$Messages.LogStatus", "Debug" ] },
1,
0
]
}
},
"NrOfInfo": {
"$sum": {
"$cond": [
{ "$eq": [ "$Messages.LogStatus", "Info" ] },
1,
0
]
}
},
"NrOfWarning": {
"$sum": {
"$cond": [
{ "$eq": [ "$Messages.LogStatus", "Warning" ] },
1,
0
]
}
}
}}
])
所以基本上测试了“状态”值以及匹配与否的位置,然后将相应的计数值添加到适当的字段中。