具有管道匹配问题的Mongodb聚合查找

时间:2019-08-31 00:23:43

标签: mongodb aggregation-framework

将Mongodb聚合查找函数与管道一起使用不会通过使用match with variable返回预期结果,仅当不使用该变量并给出_id时,match才能按预期执行。

我已经建立了一个管道,并且我的查找阶段使用_id变量作为其中的集合,以引用查找集合并搜索关联项列表。当我在决赛中使用已知的_id时,可以得到预期的结果,但是,当我从查找的“ let”部分使用变量_id时,将返回一个空数组。我尝试使用ObjectId()函数内部的变量,将其用作字符串,或直接使用它。我还进行了一个投影,以发现该变量返回正确的ID。

如果我不使用最终匹配,则流水线的前两个阶段的所有结果都将附加到DAU,这确实表明联接值位于最终$ match之前的流水线中。

Assoc_Certs是一个ObjectId数组,例如:

Assoc_Certs: { 0: ObjectId('1234'), 1: ObjectId('1235'), 2: ObjectId('1236')}

certs._id是用于变量的ObjectId,可以在Assoc_Certs数组中找到。

db.certs.aggregate([
  {
    '$match': {
      'Active': true, 
      'Category': 'Certification'
    }
  }, {
    '$lookup': {
      'from': 'dau', 
      'let': {
        'objid': '$_id'
      }, 
      'pipeline': [
        {
          '$match': {
            'Alloc_Period_Info.e_date': {
              '$gte': new Date('Fri, 30 Aug 2019 06:00:00 GMT')
            }
          }
        }, {
          '$project': {
            'DAU_ID': 1, 
            'Alloc': {
              '$filter': {
                'input': '$Alloc_Period_Info', 
                'as': 'dt', 
                'cond': {
                  '$gte': [
                    '$$dt.e_date', new Date('Fri, 30 Aug 2019 06:00:00 GMT')
                  ]
                }
              }
            }, 
            'Assoc_Certs': 1
          }
        }, {
          '$match': {
            'Assoc_Certs': '$$objid'
          }
        }
      ], 
      'as': 'DAU'
    }
  }
]);

如果我在下一个阶段替换最终的$ match,则管道将提供预期的结果。

{'$match': {Assoc_Certs: ObjectId('5c1d5b465c31a417bdcb7249')}}

使用项目$$ objid是ObjectId('5c1d5b465c31a417bdcb7249')

预期结果是管道查找将Assoc_Certs加入到$$ objid中传递的变量,而DAU字段将只有一条记录。

0 个答案:

没有答案