0

我有 2 个集合,如下所示:

branches
{
  _id: ..., 
  custId: "abc123",
  branchCode: "AA",
...other fields
}

branchHolidays
{
  _id: ..., 
  custId: "abc123", 
  holidayDate: ISODate("2019-06-01T00:00:00:0000"),
  holidayStatus: "PROCESSED",
..other fields
}

需要从分支集合中获取所有具有可用 custId 的分支假日以及分支集合中的分支代码。(branches.custId = branchHolidays.custId)

对于 join 的第一部分,我尝试了以下查询,但我从branchHolidays集合中获取了所有字段。

db.getCollection('branchHolidays').aggregate([
{
  $lookup: {
    localField: "custId",
    from: "branches",
    foreignField: "custId",
    as: "holidays"
  }
},
$match: {  holidayStatus: "PROCESSED" }
])

上面的查询返回branchHolidays集合中的所有文档。我是 mongo 的新手,但我无法弄清楚问题所在。已经完成了大多数 SO 查询,但没有找到任何有帮助的东西。

注意:在分支集合中有多个分支代码映射到 1 个 custId 。

4

1 回答 1

2

$lookup阶段类似于左外连接。示例聚合应返回branchHolidays集合中具有的所有文档holidayStatus: "PROCESSED",并且每个文档将具有一个添加的字段holidays,其中包含branches集合中具有相同的所有文档custId。对于那些不匹配任何分支的文档,该holidays字段将包含一个空数组。

如果您只想返回具有匹配分支的文档,请匹配大小,例如:

  holidays:{$not:{$size:0}}

另请注意,将其放在$match: { holidayStatus: "PROCESSED" }前面$lookup将避免查询分支集合以查找将被消除的文档,这可能会提高性能。

于 2020-05-11T05:12:54.303 回答