Следуйте назад в mongodb - PullRequest
       3

Следуйте назад в mongodb

0 голосов
/ 11 февраля 2020

Я пытаюсь добиться функциональности предложения повторного предложения в меньшем количестве возможных запросов

У меня есть 1 документ под названием Подписчики, содержащий

_id | follower | following
  1 | A        | B
  2 | B        | C
  3 | C        | D
  4 | D        | A

Как я могу предложить D следовать назад

Принимая во внимание, что если D уже следует за A, тогда D не ожидается в наборе результатов, потому что вы уже следуете за ним

_id | follower | following
  1 | A        | B
  2 | B        | C
  3 | C        | D
  4 | D        | A
  5 | A        | D

Запрос, который я пробовал до сих пор,

        let results = Follower.find({ following: userId }).select('follower').sort('-updatedAt').map(async user => {
            let amIFollowingHim = await Follower.find({ follower: user.follower });
            console.log(amIFollowingHim);

        });

Actual snapshot of followers document in tabular format

[![Followers collection snapshot][1]][1]


  [1]: https://i.stack.imgur.com/8se44.png

1 Ответ

0 голосов
/ 11 февраля 2020

Попробуйте запрос ниже: -

const condition = {
    $and: [
        { $or: [{ follower: mongoose.Types.ObjectId(userId) }, { following: mongoose.Types.ObjectId(userId) }] },

    ]
}

let data = await Follower.aggregate(
    [
        { $match: condition },
        {
            $project: {
                user: {
                    $cond: { if: { $eq: ["$follower", mongoose.Types.ObjectId(userId)] }, then: "$following", else: "$follower" }
                },
                _id: 1,
            }
        }
    ]
) 
if(data){
    const friend_id = data.map(friend => (mongoose.Types.ObjectId(friend.user)));
    const index_id = data.map(friend => (mongoose.Types.ObjectId(friend._id)));

    const condition = {
        $and: [
            { '_id': { $nin: index_id } },
            { $or: [{ follower: { $in: friend_id } }, { following: { $in: friend_id } }] },
        ]
    }
    await  Follower.aggregate(
        [
            { $match: condition },
            {
                $project: {
                    user: {
                        $cond: { if: { $in: ["$follower", friend_id] }, then: "$following", else: "$follower" }
                    },
                    _id: 1
                }
            },
            {
                $lookup: {
                    from: "users",
                    let: { "id": "$user" },
                    pipeline: [
                        { $match: { $expr: { $eq: ["$_id", "$$id"] } } }
                    ],
                    as: "user"
                }
            },
            { $match: { "user._id": { $nin: friend_id } } },
            { $unwind: '$user' },
            { $group: { "_id": '$user._id', user: { $addToSet: '$user' } } },
            {
                $project: { _id: 1, user: { $arrayElemAt: ["$user", 0] } }
            }
        ]
    );
}
...