MongoDB поисковая лента на основе, если я подписан на пользователей - PullRequest
3 голосов
/ 03 февраля 2020

Как я могу отобразить своему зарегистрированному пользователю список сообщений от людей, за которыми они следят?

У меня есть схема сообщений (сокращена для простоты):

const postSchema = {
    userId: String,
    description: String,
    timestamp: Date,
    longitude: Number,
    latitude: Number,
}

И моя схема подписчика (также сокращена):

const followerSchema = {
    userId: String, // person who click follow on a user
    followingId: String, // the account they were viewing
    timestamp: Date
}

Как найти последние сообщения, где post.user равно follower.followingId (при условии, что follower.userId равно моему зарегистрированному пользователю) )?.


Попытки пока:

  1. Я потратил пару часов на это, и я могу получить результаты только для сообщений и затем отфильтруйте их в Node.js, но это неэффективно в массовом масштабе.

  2. Вот запрос поиска , который не работает :

const posts = await Post.aggregate([
    {
        $lookup:
            {
                from: "follower",
                localField: "userId",
                foreignField: "followingId",
                as: "relationship"
            }
    },
    { "$match": { "relationship.userId": req.userId } }
]);

res.send({posts});

Любые предложения о том, как заставить это работать?

Для меня может быть лучшим решением:

  • Загрузить всех пользователей, на которых я подписан, и получить их идентификаторы
  • Загрузить все сообщения, где userId равно любой из пользовательских идентификаторов в массиве.

Ответы [ 3 ]

1 голос
/ 03 февраля 2020

Попробуйте:

const followings = await Follower.find({ userId: req.userId });
const followingIds = followings.map(f => f.followingId);
const posts = await Post.find({ userId: { $in: followingIds } });

Кстати, использование запроса aggregate является лучшим решением. Попробуйте изменить это:

    $lookup:
        {
            from: "follower",
            localField: "userId",
            foreignField: "following",
            as: "relationship"
        }

на:

    $lookup:
        {
            from: "followers",
            localField: "userId",
            foreignField: "followingId",
            as: "relationship"
        }
0 голосов
/ 03 февраля 2020

Из ответа технофила я обновил from: "follower" до from: "followers".

Мне также нужно было получить доступ к первому значению массива в $ match, а не к root (необходимо добавить 0).

{ "$match": { "relationship.0.userId": req.userId} }

const posts = await Post.aggregate([
    {
        $lookup:
            {
                from: "followers",
                localField: "userId",
                foreignField: "following",
                as: "relationship"
            }
    },
    { "$match": { "relationship.0.userId": req.userId} }
]);

res.send({posts});
0 голосов
/ 03 февраля 2020

Я думаю, что ForeignField должно быть «followId».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...