Mongodb 对符合条件的数组元素计数
我在MongoDB中有一个集合,它们的对象如下所示: 对象1Mongodb 对符合条件的数组元素计数,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"),
{
"_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" ] }
}
}
}
}
}}
])