#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: [] } } }
])