Фильтр агрегации MongoDB на основе максимального значения - PullRequest
0 голосов
/ 13 февраля 2020

Предположим, у меня есть структура документа, в которой одно из полей, X, представляет собой массив объектов av, как показано ниже.

"X" : [ 
    {
      "A" : "abc",
      "B" : 123
    },
    {
      "A" : "wer",
      "B" : 124
    },
    {
      "A" : "fgh",
      "B" : 124
    }
]

Как проецировать только тот документ, в котором поле B имеет самые высокие значения? И если максимальное значение разделяют несколько документов, я просто хочу вернуть один из них (не важно какой). В этом случае результат может выглядеть следующим образом:

"X" : [ 
    {
      "A" : "wer",
      "B" : 124
    }
]

Ответы [ 3 ]

1 голос
/ 13 февраля 2020

А как насчет этого:

db.collection.aggregate([
   {
      $set: {
         X: {
            $filter: {
               input: "$X",
               cond: { $eq: ["$$this.B", { $max: "$X.B" }] }
            }
         }
      }
   },
   { $set: { X: { $arrayElemAt: ["$X", 0] } } }
])
1 голос
/ 13 февраля 2020

Вы можете использовать $ уменьшить

  db.collection.aggregate([
      {
        "$project": {
          "X": {
            $reduce: {
              input: "$X",
              initialValue: {},
              in: {
                $cond: [ { "$gt": [ "$$this.B", "$$value.B" ]}, // Condition Check
                  "$$this",      // If condition true ($$this - Current Object)  
                  "$$value"      // If condition false $$value - Previous Returned Object
                ]
              }
            }
          }
        }
      }
    ])

Пн go Детская площадка

0 голосов
/ 13 февраля 2020

Обновленный ответ:

Другая опция, которая приводит к тому, что полный объект возвращается в конце:


    [
    {$unwind: {
      path: "$X"
    }}, 
    {$sort: {
      "X.B": -1
    }}, 
    {$group: {
      _id: { _id: "$_id"},
      X: {
        $first: "$X"
      }
    }}]

Исходный ответ:

Вы можете использовать $ max оператор (https://docs.mongodb.com/manual/reference/operator/aggregation/max/).

    [{$project: {
      X: {$max: "$X.B"}
    }}]
...