我在MongoDB中有一个集合,它们的对象如下所示:
对象1
{
"_id" : ObjectId("5afde62a91952a2980a1b751"),
"notificationName" : "Teste Agendamento Pontual",
"messages" : [
{
"timestamp" : ISODate("2018-05-17T20:29:33.045Z"),
"message" : "Teste Agendamento Pontual"
},
{
"timestamp" : ISODate("2018-05-17T20:29:33.051Z"),
"message" : "Teste"
},
{
"timestamp" : ISODate("2018-05-17T20:29:44.680Z"),
"message" : "OK"
}
]
}
对象2
{
"_id" : ObjectId("5afde62a9194322980a1b751"),
"notificationName" : "Teste Agendamento Pontual",
"messages" : [
{
"timestamp" : ISODate("2018-05-17T20:29:33.045Z"),
"message" : "Teste Agendamento Pontual"
},
{
"timestamp" : ISODate("2018-05-17T20:29:33.051Z"),
"message" : "NOT OK"
},
{
"timestamp" : ISODate("2018-05-17T20:29:44.680Z"),
"message" : "asdsadasd"
}
]
}
...
我尝试将 notificationName 分组的结果与带有确定消息的对象计数和其他具有 NOT OK <的对象计数/ strong>。 我想我需要在$ group中设置$ cond来检查消息属性,但我不确定。并且不确定这是否是实现这一目标的最佳方式。
答案 0 :(得分:1)
如果您想要匹配数组元素,那么您需要使用$filter
代替$size
来计算它们:
db.collection.aggregate([
{ "$group": {
"_id": "$notificationName",
"countOk": {
"$sum": {
"$size": {
"$filter": {
"input": "$messages.message",
"cond": { "$eq": [ "$$this", "OK" ] }
}
}
}
}
}}
])
$filter
拥有它自己的cond
参数,这是一个逻辑条件,用于返回一个布尔值,用于确定数组元素是否与该条件匹配并且可以返回。因为这只会返回message
的值数组,其中值为"OK"
,使用$eq
比较运算符进行测试,然后您计算&#34;计数&#34;生成的数组成员使用$size
。
因为你是&#34;分组&#34;你使用$group
作为执行此操作的阶段,因为你正在积累&#34;您使用$sum
运算符来&#34;加起来&#34;所有返回的$size
结果来自共享相同分组键的每个文档