Использование $ regex и оператора $ nor для одного элемента массива - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть коллекция 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 является его членом.

...