【问题标题】:Combine Mongo Documents after multiple lookups in single aggregation在单个聚合中多次查找后合并 Mongo 文档
【发布时间】:2019-05-23 23:18:11
【问题描述】:

我一直在尝试合并我的文档结果。这是我的查询和数据

{"_id":"5c21ab13d03013b384f0de26",
"roles":["5c21ab31d497a61195ce224c","5c21ab4ad497a6f348ce224d","5c21ab5cd497a644b6ce224e"],
"agency":"5b4ab7afd6ca361cb38d6a60","agents":["5b4ab5e897b24f1c4c8e3de3"]}

这里是查询

  return db.collection('projects').aggregate([
  {
    $match: {
      agents: ObjectId(agent)
    }
  },
  {
    $unwind: "$agents"
  },
  {
    $lookup: {
      from: "agents",
      localField: "agents",
      foreignField: "_id",
      as: "agents"
    }
  },
  {
    $unwind: {
      path: "$roles",
      preserveNullAndEmptyArrays: true
    }
  },
  {
    $lookup: {
      from: "roles",
      localField: "roles",
      foreignField: "_id",
      as: "roles"
    }
  },
  {
    $lookup: {
      from: "agencies",
      localField: "agency",
      foreignField: "_id",
      as: "agency"
    }
  }
])

如您所见,项目集合中的条目有两个数组,在对每个条目执行查找之前展开,然后对“代理”字段执行最终查找。

但是,当我从该查询中获得结果时,我得到的文档计数等于角色的数量。例如,我正在聚合的项目有 3 个角色和 1 个代理。所以我得到了一个包含 3 个对象的数组,每个角色一个,而不是一个文档,其中角色数组包含所有三个角色。代理数组也有可能有多个值。

迷路了……

【问题讨论】:

  • 你能把所有收藏的样本文件贴出来

标签: arrays mongodb aggregation


【解决方案1】:

您不必在$lookup 之前运行$unwindlocalField 部分指出:

如果您的 localField 是一个数组,您可能需要在管道中添加一个 $unwind 阶段。否则localField与foreignField的相等条件为foreignField: { $in: [ localField.elem1, localField.elem2, ... ] }

因此,基本上,如果您不运行 $unwind,例如在 roles 上运行,那么您将获得一个 roles 数组,而不是每个角色的文档,就像 ObjectIds 一样,由第二个集合中的对象数组替换。

所以你可以尝试以下聚合:

db.collection('projects').aggregate([
    {
        $match: {
            agents: ObjectId(agent)
        }
    },
    {
        $lookup: {
            from: "agents",
            localField: "agents",
            foreignField: "_id",
            as: "agents"
        }
    },
    {
        $lookup: {
            from: "roles",
            localField: "roles",
            foreignField: "_id",
            as: "roles"
        }
    },
    {
        $lookup: {
            from: "agencies",
            localField: "agency",
            foreignField: "_id",
            as: "agency"
        }
    }
])

【讨论】:

  • 我们刚成为最好的朋友。
猜你喜欢
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 2018-12-24
  • 2018-04-23
  • 2019-12-30
  • 1970-01-01
  • 2015-01-10
相关资源
最近更新 更多