Ведение списка заблокированных пользователей и фильтрация с заблокированными пользователями

#javascript #node.js #mongoose

#javascript #node.js #мангуст

Вопрос:

Я разрабатываю приложение для поиска талантов, для этого я использую node с mongoose в серверной части. Итак, мне нужно добавить функцию блокировки / разблокировки пользователя. Если я добавлю пользователя в список заблокированных от другого пользователя, эти два пользователя не должны отображаться в поиске, списке пользователей и т. Д..

Мне нужно фильтровать в следующих областях,

  • API списка пользователей, который выбирает всех пользователей,
  • Модуль поиска выполняет поиск конкретного пользователя

Например, если я блокирую пользователя, этот пользователь не должен передавать ни один из моих ответов.

Моя модель пользователя

 {
    _id: 1,
    name: "User One",
    email: "userone@email.com",
    mobile: "1234567890",
    gender: "male"
}
 

Модель талантов

 {
  _id: 1,
  categoryId: 1,
  experience: "good"
}
 

Моя модель категории

 {
   _id: 1,
   categoryId: 1,
   experience: "good"
}
 

И у меня есть функция фильтрации, как показано ниже

 users = await User.aggregate([
            conditions,
            {
                $lookup: {
                    from: 'talents',
                    as: 'talents',
                    let: { userId: '$_id' },
                    pipeline: [
                        {
                            $match: {
                                $expr: {
                                    $and: [
                                        {
                                            $eq: ['$userId', '$userId'],
                                        },
                                        {
                                            $in: ['$category', cat],
                                        },
                                    ],
                                },
                            },
                        },
                    ],
                },
            },
            {
                $match: {
                    talents: { $ne: [] },
                },
            },
        ]);
 

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

 {
    _id: 1,
    name: "User One",
    email: "userone@email.com",
    mobile: "1234567890",
    gender: "male",
    blockedUsers: [{
       userId: 5,
       userId: 6
    }]
}
 

Если пользователь 1 фильтрует талант с помощью приведенного выше кода, результат не должен содержать пользователей 6 и 6.

Как это сделать????

Комментарии:

1. просто передайте фильтр в $match { $expr: { $not: { $in: ["$_id", "$blockedUsers.userId"] } } }

2. Получение ошибки типа: MongoError: $in requires an array as a second argument, found: string

3. согласно So, если я создам встроенный документ внутри моей пользовательской модели, например, вы создали это поле и имеете значения массива во всех документах?

4. ДА: "blockedUsers": [ { "_id": "600a77ce7f984d231c16d7c7", "userId": "600a676435bb721d6086bd72" } ]

5. посмотрите на эту игровую площадку , она должна работать.

Ответ №1:

Вы должны выполнить 2 запроса,

Выберите текущий пользователь забронированный идентификатор пользователя:

 let currentUserID = 1;
let currentUser = await User.findOne(
  { _id: currentUserID },
  { blockedUsers: "$blockedUsers.userId", _id: 0 }
)
 

Игровая площадка

Список пользователей и исключение моих заблокированных пользователей из списка, я исправил ваш запрос,

 let users = await User.aggregate([
  {
    $match: {
      isAdminApproved: 1,
      gender: { $in: ["male"] },
      _id: { $nin: currentUser.blockedUsers }
    }
  },
  {
    $lookup: {
      from: "talents",
      as: "talents",
      let: { userId: "$_id" },
      pipeline: [
        {
          $match: {
            category: { $in: [1] },
            $expr: { $eq: ["$userId", "$userId"] }
          }
        }
      ]
    }
  },
  { $match: { talents: { $ne: [] } } }
])
 

Игровая площадка