Условие соответствия элементов массива - PullRequest
0 голосов
/ 12 июня 2018

У меня есть коллекция в 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"
        }        
    ]
}

...

Я пытаюсь получить результат, сгруппированный по messagesName с количеством объектов с OK сообщениями и другим количеством с объектами с NOT OK .Я думаю, что мне нужно сделать $ cond in $ group для проверки свойства message , но я не уверен в этом.И не уверен, что это лучший способ добиться этого.

1 Ответ

0 голосов
/ 13 июня 2018

Если вы хотите сопоставить элементы массива, вам нужно вместо этого $filter и считать их, используя $size:

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

$filter имеет собственный аргумент cond, который является логическим условием для возврата логического значения, определяющего, соответствует ли элемент массива этому условию или нет и может ли быть возвращено.Так как это только тогда вернет массив значений из message, где значение равно "OK", используя для сравнения оператор сравнения $eq, тогда вы "посчитаете" полученные элементы массива, используя $size.

Поскольку вы «группируете», вы используете $group в качестве этапа для этого, а поскольку вы «накапливаете», вы используете $sum оператор «сложить» все возвращенные $size результаты для каждого документа, использующего один и тот же ключ группировки

...