首页 > 解决方案 > 在同一个数组元素上使用 $regex 和 $nor 运算符

问题描述

我有包含用户组的 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 是该组的成员。

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

标签: javascriptnode.jsmongodbmongooseaggregation-framework

解决方案


推荐阅读