我有以下结构:
{
"_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避免错误