关注者 - mongodb查询检查

时间:2018-06-19 00:31:06

标签: node.js mongodb mongoose mongodb-query

我的数据库中有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
},
]

2 个答案:

答案 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)

也许你可以把它分成两步。

1。查询用户并获得结果

例如,你得到一个用户。

{
    _id: userIdTwo,
    "username": "random27005688",
}

2。查询跟随并获取是否已关注用户。

,例如

has_followed=db.Following.find({"userId":userIdTwo}).count()

不是最好的解决方案,但它可能有助于你。