$ match in $ lookup结果

时间:2017-02-07 13:27:25

标签: mongodb mongodb-query aggregation-framework

我有下一个mongo代码:

db.users.aggregate([
    { 
        $match: { 
            $and: [
                { UserName: { $eq: 'administrator' } }, 
                { 'Company.CompanyName': { $eq: 'test' } }
            ]                   
        } 
    },
    { 
        $lookup: { 
            from: "companies", 
            localField: "CompanyID", 
            foreignField: "CompanyID", 
            as: "Company" 
        } 
    },
])

代码的$lookup部分运行良好。我得到了下一个结果:

enter image description here enter image description here

但是,如果我在代码中添加$match,则不会带来任何结果。

我发现问题出现在第二场比赛中:{ 'Company.CompanyName': { $eq: 'test' } },但我无法意识到它有什么问题。 有什么想法吗?

更新

我还在$unwind结果上尝试$lookup,但没有运气:

db.users.aggregate([
    { 
        $match: { 
            $and: [
                { UserName: { $eq: 'administrator' } }, 
                { 'Company.CompanyName': { $eq: 'edt5' } }
            ] 
        } 
    },
    {   unwind: '$Company' },
    { 
        $lookup: { 
            from: 'companies', 
            localField: 'CompanyID', 
            foreignField: 'CompanyID', 
            as: 'Company' 
        } 
    },
])

3 个答案:

答案 0 :(得分:18)

使用MongoDB 3.4,您可以运行使用 $addFields 管道和 $filter 运算符的聚合管道,仅返回{{ 1}}数组,其元素与给定条件匹配。然后,您可以使用 $filter 运算符包装 $arrayElemAt 表达式,以返回单个文档,该文档实质上包含 {{3}通过展平数组来实现功能。

按照此示例来理解上述概念:

Company

答案 1 :(得分:0)

以下答案适用于mongoDB 3.6或更高版本。

鉴于:

  • 您有一个具有字段users的集合CompanyID和一个具有companies字段的CompanyID集合
  • 您要通过匹配CompaniesUsers上查找CompanyID,其中:

    • 每个用户必须符合以下条件:User.UserName等于administrator
    • Company上的每个User必须符合条件:CompanyName等于edt5

以下查询将为您服务:

  db.users.aggregate([
    { $match: { UserName: 'administrator' } },
    {
      $lookup: {
        from: 'companies',
        as: 'Company',
        let: { CompanyID: '$CompanyID' },
        pipeline: [
          {
            $match: {
              $expr: {
                $and: [
                  { $eq: ['$CompanyID', '$$CompanyID'] },
                  { $eq: ['$CompanyName', 'edt5'] },
                ]
              }
            }
          }
        ]
      }
    },
  ])

说明: 这是执行条件比简单的外部/本地字段相等匹配复杂的左联接查询的方法。

您使用:

代替使用localFieldforeignField
  • let选项,您可以在其中将本地字段映射到变量,
  • pipeline选项,您可以在其中指定聚合Array

pipeline中,您可以将$match过滤器与$expr一起使用,在这里您可以重用先前在let中定义的变量。

More info on $lookup

Nice tutorial

答案 2 :(得分:0)

这是在查找中拟合数组的代码。

while IFS=$' \t\n\r' read -r LINE