我有以下结构:

{
   "_id":"some_id",
   "tweets":[
      {
         "id":"1077633161922785281",
         "created_at":"Tue Dec 25 18:32:21 +0000 2018",
         "favorite_count":1905,
         "retweet_count":27,
         "media":[

         ],
         "text":"Chillin",
         "avatar":"https://pbs.twimg.com/profile_images/1062579676508381184/gDukIs20_normal.jpg",
         "name":"Chance Morris",
         "display_name":null,
         "user_id":"1087348778",
         "likedBy":[
            "some-random-dude"
         ],
         "likes":1
      }
   ]
}


如果用户的ID存在于数组中,我想将该likedBy数组投影到liked: true/false

  return db().collection('gamers').aggregate([
    {
      $project: {
        'tweets.id': 1,
        'tweets.likedBy': 0,
        "tweets.is_liked" : {
          $in: [ "some-random-dude", '$tweets.likedBy' ]
        }
      }
    }
  ]).toArray()


即使用户的id包含在LikeedBy数组中,无论如何我仍然会得到is_liked: false

关于我可能做错了什么的任何想法?

最佳答案

您需要$map,因为tweets是一个数组,而likedBy是另一个内部数组,请尝试:

db.gamers.aggregate([
    {
        $project: {
            tweets: {
                $map: {
                    input: "$tweets",
                    as: "tweet",
                    in: {
                        id: "$$tweet.id",
                        is_liked: { $in: [ "some-random-dude", { $ifNull: [ "$$tweet.likedBy", [] ] } ] }
                    }
                }
            }
        }
    }
])


编辑:当likedBy中没有tweets时,可以使用$ifNull避免错误

09-25 20:01