Mongodb 对符合条件的数组元素计数

Mongodb 对符合条件的数组元素计数,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我在MongoDB中有一个集合,它们的对象如下所示: 对象1 { "_id" : ObjectId("5afde62a91952a2980a1b751"), "notificationName" : "Teste Agendamento Pontual", "messages" : [ { "timestamp" : ISODate("2018-05-17T20:29:33.045Z"),

我在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分组,其中包含OK消息的对象计数,以及包含notok消息的其他对象计数。
我想我需要在$group中创建$cond来检查message属性,但我不确定这一点。并且不确定这是否是实现这一目标的最佳方法。

如果需要匹配的数组元素,则需要使用以下方法进行计数:

具有自己的
cond
参数,该参数是返回布尔值的逻辑条件,用于确定数组元素是否匹配该条件,并且可以返回。由于这只会使用比较运算符从
消息
返回一个值数组,其中值为
“OK”
,因此您可以使用


由于您使用“分组”作为执行此操作的阶段,并且由于您使用“累加”,因此您使用运算符“累加”来自共享相同分组键的每个文档的所有返回结果

如果您希望匹配数组元素,则改为使用以下方法对其进行计数:

具有自己的
cond
参数,该参数是返回布尔值的逻辑条件,用于确定数组元素是否匹配该条件,并且可以返回。由于这只会使用比较运算符从
消息
返回一个值数组,其中值为
“OK”
,因此您可以使用

因为您使用“分组”作为执行此操作的阶段,并且因为您使用“累积”,所以您使用运算符“累积”共享相同分组键的每个文档的所有返回结果

db.collection.aggregate([
  { "$group": {
    "_id": "$notificationName",
    "countOk": {
      "$sum": {
        "$size": {
          "$filter": {
            "input": "$messages.message",
            "cond": { "$eq": [ "$$this", "OK" ] }
          }
        } 
      }
    }
  }}
])