Mongodb $ expr в массиве - PullRequest
       1

Mongodb $ expr в массиве

0 голосов
/ 02 марта 2020

Mongodb: 4.0.13

У меня проблемы с пониманием и работой $ expr с массивами.

Давайте начнем и создадим новую коллекцию (dbRepeatElement) со следующим документом:

db.testRepeatElement.insert([
{
    "data" : {
        "FlsResSemires_2" : {
            "Sospensione" : [
                {
                    "DataInizio" : 1548806400000,
                    "DataFine" : 1549065600000,
                    "Motivazione" : "1"
                }
            ]
        }
    },
    "derived" : {
        "DATAFINEANNORIFERIMENTO" : 1609372800000,
        "regione190" : "190",
        "REGAOEROG" : "190209820300",
        "REGASLEROG" : "190209"
    }
}    
])

При большем агрегировании следующая часть не работает:

db.testRepeatElement.aggregate([
    {
        $match: {
             $expr: {
                 $gt: ["$data.FlsResSemires_2.Sospensione.DataInizio", "$derived.DATAFINEANNORIFERIMENTO"]
             }
        }
    }

])

Результат : вернуть совпадение (неверно! Просто проверьте даты)

Чтение документации mongodb, по-видимому, при использовании комбинации с массивами, агрегация и $ expr не возвращает ожидаемый результат, и вам нужно указать элемент массива, который вы хотите проверить, например:

db.testRepeatElement.aggregate([
    {
        $match: {
             $expr: {
                 $gt: ["$data.FlsResSemires_2.0.Sospensione.DataInizio", "$derived.DATAFINEANNORIFERIMENTO"]
             }
        }
    }

])

Результат : возвращать без совпадения (верно!)

Вопрос : мое требование - проверить каждый элемент в массиве, как это решить, без использования $ unwind ? Почему такой результат?

1 Ответ

2 голосов
/ 02 марта 2020

Оператор агрегации $filter используется для выполнения операции match над элементами массива. Следующий запрос агрегации приведет только к элементам массива Sospensione, которые соответствуют условию $gt:

db.testRepeatElement.aggregate( [
{
  $addFields: {
      "data.FlsResSemires_2.Sospensione": {
          $filter: {
              input: "$data.FlsResSemires_2.Sospensione",
              cond: {
                $gt: [ "$$this.DataInizio", "$derived.DATAFINEANNORIFERIMENTO" ]
              }
          }
      }
  }
},
{
   $match: { 
       $expr: {
            $gt: [ { $size: "$data.FlsResSemires_2.Sospensione" }, 0 ]
       }
   }
}
] ).pretty()
...