【问题标题】:MongoDB lookup match two elements in arrayMongoDB查找匹配数组中的两个元素
【发布时间】:2020-07-06 23:45:47
【问题描述】:

我有一个用户集合,其文档如下所示:

{
      "name": "James",
      "participations": [
        {
          participant_id: 1,
          participant_type: "Board",
          // other fields
        },
        {
          participant_id: 2,
          participant_type: "Team"
          // other fields
        }
      ]
    },

我正在聚合用户集合:

db.boards.aggregate([
  { '$match' => { _id: 65 } },
  { '$lookup' => 
        { from: "users", as: "users",
          let: { "board_id": "$_id" },
          pipeline: [
            { '$match' =>
               { '$expr' => {
                 '$and' => [
                    { '$in' => ["Board", "$participations.participant_type"] },
                    { '$in' => ["$$board_id", "$participations.participant_id"] }, 
                 ]
              }}
            }
          ],
        } 
      },
])

但是,上面的逻辑是有缺陷的。如果用户参与了 id 为 65 的团队,则该用户将出现,即使他没有参与董事会。

我想选择所有参与的用户,其参与者类型为“Board”,参与者 ID 为 65。我尝试使用 elemMatch,但显然聚合框架不支持它?

【问题讨论】:

    标签: mongodb aggregation-framework mongoid


    【解决方案1】:

    如果您对参与数组中的每个元素都不感兴趣,您可以通过 $unwinding 参与字段来实现您的目标。这将为数组中的每个元素提供一个文档,然后您可以像这样进行匹配:

    pipeline: [
                { '$unwind' => '$participations' },
                { '$match' =>
                   { '$expr' => {
                     '$and' => [
                        { '$eq' => ["Board", "$participations.participant_type"] },
                        { '$eq' => ["$$board_id", "$participations.participant_id"] }, 
                     ]
                  }}
                }
              ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 2015-05-23
      • 2013-08-10
      • 1970-01-01
      • 2016-02-17
      • 1970-01-01
      相关资源
      最近更新 更多