Возникли проблемы с проекцией mongoDB с условием - PullRequest
1 голос
/ 01 августа 2020

Предположим, у меня есть следующие данные в другой коллекции под названием 'Collection1'

userID: "1"
container:[
    {"item" : "false", "price" : NumberDecimal("80"), "sizes" : "S", "arrayIndex" : NumberLong(0) }
    {"item" : "false", "price" : NumberDecimal("80"), "sizes" : "M", "arrayIndex" : NumberLong(1) }
    {"item" : "true", "price" : NumberDecimal("80"), "sizes" : "L", "arrayIndex" : NumberLong(2) }
]

Я присоединяю 'Collection1' к моему основному запросу следующим образом (перед объединением выполняется много шагов, и я хочу чтобы упростить это)

    {$lookup:{
        from:'Collection1',
  localField:'result',
foreignField:'userID',
          as:'photos'
    }},

    {$unwind:{
        path:'$photos',
        preserveNullAndEmptyArrays:true
    }},

До сих пор все было хорошо, пока я не сделал проект.

{$project:
   {'photo':
   {$cond:{
      if:{$eq:['$photos.container.item',false]},
      then:'$photos.container.price',
      else:null
       }
    }
 }},

Работает проецирование любого элемента без условия. Однако я также делаю проекцию с другим условием, и здесь нет никаких проблем.

Ожидаемый результат будет

[
 {
   otherElement:....
   photos:{
     price:80
   }
 }
]

Кто-нибудь может сказать мне, почему это не работает. Опять же, мне очень жаль, что мне пришлось как-то это упростить. Если это непонятно, я могу попытаться сделать его более понятным.

Ответы [ 2 ]

0 голосов
/ 02 августа 2020

В моем случае раскручивать массив не должно. Вместо этого я должен проецировать и фильтровать с условием.

{$project:
   {'photos':
      {$filter:
         {
         input:'$photos.container',
         as:'photo',
         cond:{
             $eq:['$$photo.profilePic',true]
              }
         }
    }
}}

Большое спасибо, ребята, что вы на это посмотрели. Я ценю это!

0 голосов
/ 01 августа 2020

Поле вашего контейнера представляет собой массив, поэтому выполнение этого $ eq:['$photos.container.item',false] не будет работать напрямую, вам нужно сначала развернуть container, чтобы преобразовать его в объект, как показано ниже.

  {
    $unwind: {
      path: "$photos.container",
      preserveNullAndEmptyArrays: true
    }
  },

Вот рабочий пример Площадка MongoDB

...