首页 > 解决方案 > 如何在猫鼬聚合期间有条件地投影字段

问题描述

我有一个类似的问题文件。

[
 {
   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"
       ]
     }
  }
}
])

PS:我稍微更新了我的问题,查看器中的对象有多个键值对。即userID, viewedAt_filledAt

标签: mongodbmongooseaggregation-framework

解决方案


使用$in3.4 中的聚合表达式。

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

或者

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

推荐阅读