$ match in $ lookup结果

Ale*_*erd 13 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" 
        } 
    },
])
Run Code Online (Sandbox Code Playgroud)

$lookup部分代码工作的伟大.我得到了下一个结果:

在此输入图像描述 在此输入图像描述

但是,如果我添加$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' 
        } 
    },
])
Run Code Online (Sandbox Code Playgroud)

chr*_*dam 21

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

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

db.users.aggregate([
    { "$match": { "UserName": "administrator" } },
    { 
        "$lookup": { 
            "from": 'companies', 
            "localField": 'CompanyID', 
            "foreignField": 'CompanyID', 
            "as": 'Company' 
        } 
    },
    {
        "$addFields": {
            "Company": {
                "$arrayElemAt": [
                    {
                        "$filter": {
                            "input": "$Company",
                            "as": "comp",
                            "cond": {
                                "$eq": [ "$$comp.CompanyName", "edt5" ]
                            }
                        }
                    }, 0
                ]
            }
        }
    }
])
Run Code Online (Sandbox Code Playgroud)


Jan*_*lak 5

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

鉴于:

  • 你有收集users与现场CompanyID和集合companies与现场CompanyID
  • 要查找Companies有关Users的匹配CompanyID,其中另外:

    • 每个用户必须符合条件:User.UserName等于administrator
    • 每个Companyon 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'] },
                ]
              }
            }
          }
        ]
      }
    },
  ])
Run Code Online (Sandbox Code Playgroud)

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

代替使用localFieldforeignField,使用:

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

在中,pipeline您可以使用$match带有的过滤器,$expr您可以在其中重复使用之前定义的变量let

有关$ lookup的更多信息

不错的教程

  • 这提供了比应有的更多的结果 (3认同)
  • 关于`{ $eq: ['$CompanyID', '$$CompanyID'] },`。左侧是“公司”字段 (2认同)