计算数组元素匹配条件

时间:2018-06-12 20:00:51

标签: mongodb mongodb-query aggregation-framework

我在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来检查消息属性,但我不确定。并且不确定这是否是实现这一目标的最佳方式。

1 个答案:

答案 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结果来自共享相同分组键的每个文档