Запрос Mongodb с использованием условия из предыдущего поля, определенного через $ first - PullRequest
0 голосов
/ 21 декабря 2018

Попытка суммировать документы по условию, когда отметка времени равна первой найденной отметке времени

Необходимо суммировать количество документов, которые удовлетворяют условию, что документ соответствует первому найденному значению отметки времени.Ниже я попробовал сослаться на отметку времени, равную {"$ first": "$ timestamp"}

IP.aggregate([
    {
      "$sort":{'timestamp':-1}
    },
    {
    "$group": {
        "_id": "$application",
        "url": { "$first": "$app_url_name" },
        "timestamp": { "$first": "$timestamp" },
        "total": {
          $sum:  {
            $cond: {
              if: {
                $and:[
                  {$eq: ['$environment_category', 'PROD']},
                  {$eq: ['$timestamp', '$_id.timestamp']}
                ]
              },
              then: 1,
              else: 0
            }
          }
        },
        "enabled": { $sum:  {$cond: {if: {
                  $and: [
                    {$eq: ['$availability', 'available']},
                    {$eq: ['$state', 'enabled']},
                    {$eq: ['$environment_category', 'PROD']}
                    ]
                  } ,
                then: 1,
                else: 0} }}
    }
},

1 Ответ

0 голосов
/ 26 декабря 2018

Вот решение:

db.ips.aggregate([      
{
    "$sort": { "timestamp": -1 }
},
{ 
  "$group": { 
      "_id": "$application",          
      "doc": { "$first": "$$ROOT" },
      "items": {"$push": "$$ROOT"}
   } 
},
{
    "$project": { 
      "_id": 0, 
      "application": "$_id",
      "timestamp": "$doc.timestamp",
      "items": {
        "$filter": {
           "input": "$items",
           "as": "item",
           "cond": { "$eq": [ "$$item.timestamp", "$doc.timestamp" ] }
        }
     }
   }
},

]);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...