У меня есть коллекция mongodb, которая содержит группы пользователей:
[
{
groupName: "Blablabla",
members: [
{ nick: "rick" },
{ nick: "ethan" },
{ nick: "jack" }
]
},
{
groupName: "Lalala",
members: [
{ nick: "rick" },
{ nick: "john" },
{ nick: "mark" }
]
}
...
]
И я хочу, чтобы пользователь (например, rick ) мог выполнять поиск этих групп по имени группы или по никам членов группы.
Вот мой запрос агрегации (я использую mongoose):
Group.aggregate([
{ $match: {
$or: [
{ 'members.nick': { $regex: req.query.searchquery } },
{ groupName: { $regex: req.query.searchquery } }
]
} }
]);
И это прекрасно работает, но когда я передаю что-то, что соответствует Рику, как поисковый запрос, это дает мне только все группы, членом которых является Рик. Что бесполезно.
Я пробовал что-то вроде этого:
//req.session.user.nick equals rick
Group.aggregate([
{ $match: {
$or: [
{ $and: [
{ 'members.nick': { $regex: req.query.searchquery } },
{ $nor: [{ 'members.nick': req.session.user.nick }] }
] },
{ groupName: { $regex: req.query.searchquery } }
]
} }
]);
Но, похоже, он не ссылается на один и тот же ник члена, и все запросы возвращают пустой массив.
Итак, вопрос в том, как выбрать группу, в которой значение элемента массива соответствует регулярному выражению и в то же время не равно rick?
Пример: * ** 1022 тысячу двадцать одна *
Использование этой агрегации:
Group.aggregate([
{ $match: {
$or: [
{ 'members.nick': { $regex: req.query.searchquery } },
{ groupName: { $regex: req.query.searchquery } }
]
} }
]);
Когда я передаю «blabla» в качестве поискового запроса, это дает мне первую группу «Bla blabla ». Когда я передаю "joh", это дает мне группу "Lalala", потому что пользователь joh n является членом этой группы.
Но когда я передаю "ck", зарегистрированный как пользователь rick, я не хочу, чтобы он возвращал обе группы (потому что ri ck является их членом), а только первую группу, потому что ja ck является его членом.