как я могу сделать условный поиск в пимонго? - PullRequest
1 голос
/ 25 сентября 2019

Я пытаюсь сделать условный запрос.Я хочу найти во всей коллекции те документы, которые соответствуют диапазону цен 25%, и если у документов есть определенное поле (в данном случае «audiPrice»), я буду использовать это поле для поиска, и если этот документ неВ этом поле я буду использовать поле 'price'

У меня есть поиск в документации mongodb (https://docs.mongodb.com/manual/reference/operator/aggregation/cond/), я нашел оператора $cond, и я попытался сделать запрос каквы можете увидеть

pipeline = [
    {
        '$cond': {
            'if': {'audiPrice': {'$exists': True}}, 'then': {'$match':
                {'audiPrice': {
                    '$lte': price * 1.75, '$gte': price * 0.25
            }
                }
            },'else': {'$match': {
                'price': {
                    '$lte': price * 1.75, '$gte': price * 0.25
            }
            }


        }

    }
    }

]

и я получил это сообщение об ошибке

pymongo.errors.OperationFailure: Unrecognized pipeline stage name: '$cond'

Знаете ли вы, как я могу достичь своей цели?

Я использую python и pymongo.

спасибо

1 Ответ

0 голосов
/ 25 сентября 2019

Вы можете использовать cond в $ project или $ expr на этапе $ match следующим образом:

collectionName.aggregate([
  {
    $match: {
      $expr: {
        $cond: {
          if: {
            $gt: [
              "$audiPrice",
              null
            ]
          },
          then: {
            $and: [
              {
                $gte: [
                  "$audiPrice",
                  price * 0.25
                ]
              },
              {
                $lte: [
                  "$audiPrice",
                  price * 1.75
                ]
              }
            ]
          },
          else: {
            $and: [
              {
                $gte: [
                  "$price",
                  price * 0.25
                ]
              },
              {
                $lte: [
                  "$price",
                  price * 1.75
                ]
              }
            ]
          }
        }
      }
    }
  }
])

Здесь вы сначала проверяете, не является ли поле audiPrice нулевым, затем выполняйте сопоставление с этим ключом еще с ценовым ключом.

...