Как условно спроецировать поля при агрегации в мангусте - PullRequest
0 голосов
/ 31 августа 2018

У меня есть вопрос к документам вроде.

[
 {
   type:"general",
   viewers:[
           {userId:"1", viewedAt:"10 Aug"},
           {userId:"2", viewedAt:"12 Aug"}
           ] 
 },

 {
   type:"programming",
   viewers:[
            {userId:"3", viewedAt:"1 Aug"},
            {userId:"2", viewedAt:"19 Aug"}
           ]
 }
]

И ожидаемый результат добавить дополнительное поле с именем viewed:

если задано userId предположим, что userId:1 есть в списке зрителей, тогда добавьте viewed:true

иначе viewed:false следующим образом:

[
 {
   "type":"general",
   "viewed":"true"
 },
 {
   "type":"general",
   "viewed":"false"
 }
]

Я пробовал этот код, но выдает ошибку:

Question.aggregate([
  {
  $project:{
    type:1,
    viewed:{
       $cond:[
         {$viewedBy:{"userId":1}},"true","false"
       ]
     }
  }
}
])

P.S: Я немного обновил свой вопрос, у объектов в средствах просмотра есть несколько пар ключ-значение. т.е. userID, viewedAt, filledAt

1 Ответ

0 голосов
/ 31 августа 2018

Использовать $in агрегационное выражение в 3.4.

Question.aggregate([
  {
   $project:{
    type:1,
    viewed:{
       $cond:[ {$in:[{userId:"1"}, "$viewers"]},"true","false"]
    }
  }
 }
])

OR

Question.aggregate([
  {
   $project:{
    type:1,
    viewed:{
       $cond:[ {$in:["1", "$viewers.userId"]},"true","false"]
    }
  }
 }
])
...