在同一数组元素上使用$ regex和$ nor运算符

时间:2018-09-05 06:30:58

标签: javascript node.js mongodb mongoose aggregation-framework

我有mongodb集合,其中包含用户组:

[
  {
    groupName: "Blablabla",
    members: [
      { nick: "rick" },
      { nick: "ethan" },
      { nick: "jack" }
    ]
  },
  {
    groupName: "Lalala",
    members: [
      { nick: "rick" },
      { nick: "john" },
      { nick: "mark" }
    ]
  }
  ...
]

我希望用户(例如 rick )能够通过组名或组成员昵称搜索这些组。

这是我的汇总查询(我正在使用猫鼬):

Group.aggregate([
  { $match: {
    $or: [
      { 'members.nick': { $regex: req.query.searchquery } },
      { groupName: { $regex: req.query.searchquery } }
    ]
  } }
]);

它工作正常,但是当我通过与rick相匹配的内容作为搜索查询时,它只给我所有rick所属的组。这没用。

我尝试过这样的事情:

//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 } }
    ]
  } }
]);

但是似乎没有引用相同的成员nick,并且所有查询都返回了空数组。

所以问题是我该如何选择数组元素值与正则表达式匹配且同时不等于rick的组?

示例:

使用此聚合:

Group.aggregate([
  { $match: {
    $or: [
      { 'members.nick': { $regex: req.query.searchquery } },
      { groupName: { $regex: req.query.searchquery } }
    ]
  } }
]);

当我通过“ blabla”作为搜索查询时,它给了我第一个“ Bla blabla ”组。当我通过“ joh”时,它会给我“ Lalala”组,因为用户 joh n是该组的成员。

但是当我通过以rick用户身份登录的“ ck”时,我不希望它返回两个组(因为ri ck 是它们的成员),而只返回第一个组,因为ja ck 是其成员。

0 个答案:

没有答案