使用聚合 $lookup 加入 mongodb

Posted

技术标签:

【中文标题】使用聚合 $lookup 加入 mongodb【英文标题】:Joins in mongodb using aggregate $lookup 【发布时间】:2017-06-24 19:25:53 【问题描述】:

在这里需要帮助。

我有两个集合,第一个集合不是很大,文档很小。

第二个有更多的项目(数千个,可能更多),中等大小的文档。

第一个文档中的某个属性与第二个文档中的某个属性相匹配。

这里的关系是第一个集合中的项目与第二个集合中的许多其他项目正在引用它。

例如,我有代表个人的第一个集合和代表信用卡交易的第二个集合。一个人可能有很多交易。 PersonId 是 people 集合的 id 以及 transactions 集合中的每个交易文档。

我想写一个查询来计算每个人有多少事务。

我已经看到建议使用聚合和查找。 但是当我尝试这样做时,我会收到一条消息,说明文档大小超出了限制。

我猜这是因为它将一个人的所有交易汇总到一个文档中……不确定,这是我第一次使用 mongodb。

实现这一目标的最佳方法是什么?聚合方法是正确的选择吗?

谢谢! 吉利

【问题讨论】:

【参考方案1】:

您可以使用简单的分组来获取每个人的交易计数

db.transactions.aggregate([
   $group: _id: "$personId", count: $sum:1
])

输出将包含人员 ID 和该人员的交易计数。您可以匹配内存中的人员和交易统计信息。您还可以使用查找来返回带有一些个人数据的交易统计信息。但请记住 - 您不会为没有交易的人检索条目:

db.transactions.aggregate([
   $group: _id: "$personId", count: $sum:1,
   $lookup:
      
        from: "people",
        localField: "_id",
        foreignField: "_id",
        as: "person"
      
  ,
  $unwind: "$person",
  $project:name:"$person.name", count:"$count"
])

【讨论】:

以上是关于使用聚合 $lookup 加入 mongodb的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mongodb 中使用 $lookup 加入多个集合

Mongoose:$lookup 后的 $project 不显示字段

猫鼬模式中的加入/查找聚合

如何使用 MongoDB 聚合 `$lookup` 作为 `findOne()`

Mongoose,使用 $lookup 的聚合查询返回 null?

Mongodb 聚合 $lookup 和 group 非常非常慢