首页 >后端开发 >Golang >如何使用聚合管道在 MongoDB 中基于多个属性值检索项目计数?

如何使用聚合管道在 MongoDB 中基于多个属性值检索项目计数?

Susan Sarandon
Susan Sarandon原创
2024-10-26 19:20:29536浏览

How to Retrieve Item Count Based on Multiple Attribute Values in MongoDB using Aggregation Pipeline?

通过检查 MongoDB 中的多个属性值来检索项目列表

使用 MongoDB 时,经常需要根据多个属性值检索特定项目属性值,类似于MySQL中使用的IN条件。本文演示了如何使用 MongoDB 中的管道操作组合来实现此目的。

聚合框架

在这个场景中,我们将使用聚合框架构建一个用于过滤和聚合来自 MongoDB 集合(称为“venueList”)的数据的管道。目标是根据场地 ID 列表检索使用特定操作系统(例如 Linux 或 Ubuntu)的用户总数。

管道阶段

The管道由多个阶段组成,这些阶段协同工作来转换和汇总数据:

  1. $match: 根据指定的场地 ID 过滤集合,确保仅考虑相关文档.
  2. $unwind: 非规范化“venueList”和“sum”数组,为每个场地和用户代理分发创建单独的文档。
  3. $match: 再次过滤非规范化文档,以确保仅包含所需的场地 ID。
  4. $unwind: 进一步对“sum”数组进行非规范化,为每个用户代理分发创建单独的文档.
  5. **$group:** 使用 $cond 运算符聚合非规范化文档,为每个操作系统(例如“linux”和“ubuntu”)创建单独的字段。 $sum 运算符用于计算每个操作系统的用户总数。

预期输出

聚合管道的最终输出将是包含指定场地 ID 上的 Linux 和 Ubuntu 用户总数的文档:

<code class="json">{
  "_id": null,
  "linux": 14,
  "ubuntu": 4
}</code>

Go 实现

使用 mgo 包在 Go 中使用此管道,您可以按照以下步骤操作:

<code class="go">query := []bson.M{
  {"$match": bson.M{"venueList.id": bson.M{"$in": []string{"VID1212", "VID4343"}}}},
  {"$unwind": "$venueList"},
  {"$match": bson.M{"venueList.id": bson.M{"$in": []string{"VID1212", "VID4343"}}}},
  {"$unwind": "$venueList.sum"},
  {
    "$group": bson.M{
      "_id":        nil,
      "linux":      bson.M{"$sum": bson.M{"$cond": []interface{}{bson.M{"$eq": []interface{}{"$venueList.sum.name", "linux"}}, "$venueList.sum.value", 0}}},
      "ubuntu":     bson.M{"$sum": bson.M{"$cond": []interface{}{bson.M{"$eq": []interface{}{"$venueList.sum.name", "ubuntu"}}, "$venueList.sum.value", 0}}},
    },
  },
}</code>

以上是如何使用聚合管道在 MongoDB 中基于多个属性值检索项目计数?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn