【问题标题】:Mongo lookup returning all valuesMongo 查找返回所有值
【发布时间】:2020-08-26 03:50:25
【问题描述】:

我有 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
}

需要获取所有 branchHolidays 以及 branches 集合中可用的 custId 以及 branches 集合中的 branchCode。 (branches.custId = branchHolidays.custId)

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

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

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

注意:branches 集合中有多个 branchCodes 映射到 1 个 custId。

【问题讨论】:

  • 不完全清楚您要做什么。由于您在 branchHolidays 上进行聚合并且仅通过 holidayStatus: "PROCESSED" 进行过滤,因此您应该在 branchHolidays 中获取所有文档,除了那些未标记为 PROCESSED 的文档。您是否打算根据 $lookup 结果进行额外的过滤?
  • 不应该只给我那些 branchHolidays.custId = branches.custId 的文件吗?相反,即使分支集合中不存在 custId,它也会给我所有文档。

标签: mongodb mongodb-query aggregation-framework mongodb-lookup


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多