在聚合管道中设置条件在mongodb中不起作用

时间:2020-07-12 03:06:25

标签: mongodb mongoose nosql nosql-aggregation

我有两个收藏集,如下所示:

Users:

_id                                     |   email
ObjectId("5ee493b0989d0f271cdc41c1")    |   joulie@gmail.com
ObjectId("5ee493b0989d0f271cdc41c3")    |   newelle@gmail.com
ObjectId("5ee493b0989d0f271cdc41c5")    |   john@gmail.com
ObjectId("5ee493b0989d0f271cdc41c7")    |   larry@gmail.com

Members:

group_id                                | user_id  
ObjectId("5ee5e346fae4a21e28a81d91")    | ObjectId("5ee493b0989d0f271cdc41c1")
ObjectId("5ee5e346fae4a21e28a81d92")    | ObjectId("5ee493b0989d0f271cdc41c5")

我正在尝试在 Users 集合中搜索电子邮件,并通过将提供的group_id参数与 Members <中的group_id比较,来检查与该电子邮件相关联的用户是否属于特定组/ strong>集合。

例如,如果传递的搜索参数为:电子邮件:joulie, group_id :5ee5e346fae4a21e28a81d91

Expected Output:
    [
        { "email":"joulie@gmail.com", 
          "member_info": [
            {"group_id":"5ee5e346fae4a21e28a81d91", "user_id":"5ee493b0989d0f271cdc41c1"}
            ]
        }
   ]

例如,如果传递的搜索参数为:电子邮件:newelle, group_id :5ee5e346fae4a21e28a81d91

Expected Output:
        [
            { "email":"newelle@gmail.com", 
              "member_info": []
            }
       ]

我希望这个问题有意义。

我在this first onethis second one线程中遵循了类似的解决方案,但是这些似乎都不适合我。

这是我到目前为止尝试过的:

db.users.aggregate([
      { "$match" : {email: { $regex: email +'.*'}}},
      {
        $lookup: {
          from: "members",
          let: { user_id: "$_id" },
          pipeline: [
            { $match: {
              $expr: { $and: 
                [
                  { $in: [ group_id, "$group_id" ] },
                  { $eq: [ "$$user_id", "$user_id" ] }
                ] 
              }
            }}
          ],
          as: "members"
        }
      }
])

任何帮助或指导方针将不胜感激。预先感谢!

1 个答案:

答案 0 :(得分:0)

我已按照@Joe在评论部分中指出的说明进行了操作,它对我有用。如果仍然有人遇到类似问题,则可以使用以下更新的查询:

db.users.aggregate([
      {
        "$match": {
          email: {
            $regex: email +'.*'
          }
        }
      },
      {
        $lookup: {
          from: "members",
          let: {
            user_id: "$_id"
          },
          pipeline: [
            {
              $match: {
                $expr: {
                  $and: [
                    {
                      $eq: [
                        ObjectId(group_id),
                        "$group_id"
                      ]
                    },
                    {
                      $eq: [
                        "$$user_id",
                        "$user_id"
                      ]
                    }
                  ]
                }
              }
            }
          ],
          as: "members"
        }
      },
]);

第一个问题是我在$ expr内使用$ in运算符时,我只是在比较持有Id而不是数组的字段。 我将其更改为$ eq

第二,我只是在expr中比较group_id变量(字符串类型)。 因此,我用ObjectId(group_id)替换了它,并为我工作了。另外,不要忘记在开始时导入ObjectId(即var ObjectId = require('mongodb')。ObjectID)