我的数据库中有2个集合。一个叫做用户
{
_id: storeUserId,
name: ...,
etc
}
另一个名为Follow
{
userId: ...,
followingUserId: ...
}
userId是当前用户ID,followingUserId是当前用户想要关注的ID。
例如,在User collection中我有:
{
_id: userIdOne,
etc
},
{
_id: userIdTwo,
etc
}
在以下收集中我有:
{
userId: userIdThousand,
followingUserId: userIdTwo
}
当我运行查询
时db.bios.find();
我得到了
{
"_id": userIdTwo,
"username": "random27005688"
},
{
"_id": userIdThree
"username": "random232111"
},
{
"_id": userIdOne
"username": "random2702"
}
]
结果是我想要的,但我想添加一个' isFollowed'每个结果项的字段以检查以下状态。我有一个用户ID,请说:' userIdThousand'我想用它来检查基于我的以下集合的每个结果项。例如,
check if userIdThousand is following userIdOne
check if userIdThousand is following userIdTwo, etc.
以下是我的预期结果。谢谢!
[
{
_id: userIdTwo,
"username": "random27005688",
"isFollowed": true
},
{
"_id": userIdThree
"username": "random232111",
"isFollowed": false
},
{
"_id": userIdOne
"username": "random2702",
"isFollowed": false
},
]
答案 0 :(得分:1)
您需要$lookup才能通过followingUserId
从第二个集合中获取数据,然后您可以使用$filter仅获取具有特定_id
的关注者,并检查新数组是否包含任何元素(使用$size)表示用户跟随其他用户:
db.User.aggregate([
{
$match: {
_id: { $ne: "userIdOne" }
}
},
{
$lookup: {
from: "Following",
localField: "_id",
foreignField: "followingUserId",
as: "followers"
}
},
{
$addFields: {
followers: {
$filter: { input: "$followers", as: "follower", cond: { $eq: [ "$$follower._id", "userIdOne" ] } }
}
}
},
{
$project: {
_id: 1,
username: 1,
isFollowed: { $gt: [ { $size: "$followers" }, 0 ] }
}
}
])
答案 1 :(得分:0)
也许你可以把它分成两步。
{
_id: userIdTwo,
"username": "random27005688",
}
,例如
has_followed=db.Following.find({"userId":userIdTwo}).count()
不是最好的解决方案,但它可能有助于你。