Условие установки в агрегатном конвейере не работает в mongodb - PullRequest
0 голосов
/ 12 июля 2020

У меня есть две коллекции:

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 и проверить, принадлежит ли пользователь, связанный с этим электронным письмом, к укажите группу c, сравнив предоставленный параметр group_id с group_id в коллекции Members .

Например, если переданные параметры поиска: email : joul ie, group_id : 5ee5e346fae4a21e28a81d91

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

Например, если переданные параметры поиска: email : newelle, group_id : 5ee5e346fae4a21e28a81d91

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

Надеюсь, вопрос имеет смысл.

Я последовал аналогичному решению из этого первого и второго потоков, но мне кажется, что ни один из них не работает.

Вот то, что я пробовал до сих пор:

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 голосов
/ 12 июля 2020

Я выполнил инструкции, указанные @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"
        }
      },
]);

Первая проблема заключалась в том, что я использовал оператор $ in внутри $ expr, когда я просто сравнивал поле, содержащее идентификатор. массива. Я изменил его на $ eq .

Во-вторых, я просто сравнивал переменную group_id (типа string) внутри expr. Поэтому я заменил его на ObjectId (group_id), и у меня это сработало . Также не забудьте импортировать ObjectId в начале (т.е. var ObjectId = require ('mongodb'). ObjectID)

...