MongoDB $ cond со встроенным массивом документов - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь создать новую коллекцию с полем 'des c' с учетом условия в поле в массиве документов. Для этого я использую оператор $ cond

Пример коллекции источника следующий:

{
        "_id" : ObjectId("5e8ef9a23e4f255bb41b9b40"),
        "Brand" : {
                "models" : [
                        {
                                "name" : "AA"
                        },
                        {
                                "name" : "BB"
                        }
                ]
        }
}
{
        "_id" : ObjectId("5e8ef9a83e4f255bb41b9b41"),
        "Brand" : {
                "models" : [
                        {
                                "name" : "AG"
                        },
                        {
                                "name" : "AA"
                        }
                ]
        }
}

Запрос следующий:

db.runCommand({
    aggregate: 'cars',
    'pipeline': [
        {
            '$project': {
                'desc': {
                    '$cond': {
                        if: {
                            $in: ['$Brand.models.name',['BB','TC','TS']]
                        },
                        then: 'Good',
                        else: 'Bad'
                    }
                }
            }
        },
        {
            '$project': {
                'desc': 1
            }
        },
        {
            $out: 'cars_stg'
        }
    ],
    'allowDiskUse': true,
})

Проблема в том, что оператор $ cond всегда возвращает значение "else". Я также пробовал оператор $ или с $ eq или $ и с $ ne , но всегда возвращаю "else".

Что я делаю не так или как мне это исправить?

Спасибо

1 Ответ

1 голос
/ 09 апреля 2020

Поскольку $Brand.models.name возвращает массив, мы не можем использовать оператор $in.

Вместо этого мы можем использовать $ setIntersection , который возвращает массив, содержащий элементы, которые появляются в каждом входной массив

db.cars.aggregate([
  {
    "$project": {
      "desc": {
        "$cond": [
          {
            $gt: [
              {
                $size: {
                  $setIntersection: [
                    "$Brand.models.name",
                    [
                      "BB",
                      "TC",
                      "TS"
                    ]
                  ]
                }
              },
              0
            ]
          },
          "Good",
          "Bad"
        ]
      }
    }
  },
  {
    "$project": {
      "desc": 1
    }
  },
  {
      $out: 'cars_stg'
  }
])

MongoPlayground | Альтернатива $reduce

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