首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要连接mongodb的2集合,以便根据集合字段查找聚合数据

需要连接mongodb的2集合,以便根据集合字段查找聚合数据
EN

Stack Overflow用户
提问于 2019-11-07 09:50:10
回答 1查看 46关注 0票数 0

我有存储列表作为商店收藏,它只存储基本的细节。

代码语言:javascript
复制
Store collection:
[
  {
    "id": "5dc25092d972e71c3b3e6e87",
    "name": "Chad store",
  },
  {
    "id": "5dc2899bfd1ea02f0fceb9ab",
    "name": "Bad store",
  }
]

我有信号记录收集,其中有多个信号记录为每个商店。信号记录是否定的。对于信号条、信号强度等,很少有存储可能没有信号记录。

代码语言:javascript
复制
 Signal records:

[
  {
    "id": "5dc250e0d972e71c3b3e6e88",
    "signalStrength": -180,
    "signalbars": "3",
    "employee": "5db59227f0204855654075ee",
    "store": "5dc25092d972e71c3b3e6e87",
    "carrierName": "LT&T"
  },
  {
    "id": "5dc251f723760a24de167f8e",
    "signalStrength": -180,
    "signalbars": "3",
    "employee": "5db59227f0204855654075ee",
    "store": "5dc25092d972e71c3b3e6e87",
    "carrierName": "Sprint"
  },
  {
    "id": "5dc289affd1ea02f0fceb9ac",
    "signalStrength": -80,
    "signalbars": "3",
    "employee": "5db59227f0204855654075ee",
    "store": "5dc2899bfd1ea02f0fceb9ab",
    "carrierName": "LT&T"
  }
]

代码语言:javascript
复制
Speed Tests:

[
  {
    "id": "5dc2c170e26c4a484051f4af",
    "carrierName": "Sprint"
    "ping": 10,
    "downloadSpeed": 7.66,
    "uploadSpeed": 4.22,
    "employee": "5dc2b9467a56f3446dcaf8f6",
    "store": "5dc25092d972e71c3b3e6e87"
  },
  {
    "id": "5dc3a0a92588214e1a938a34",
    "carrierName": "LT&T",
    "ping": 10,
    "downloadSpeed": 7.66,
    "uploadSpeed": 4.22,
    "employee": "5dc2b9467a56f3446dcaf8f6",
    "store": "5dc25092d972e71c3b3e6e87"
  }
]

我需要列出商店和它的信号强度根据它的载体名称。

预期产出:

代码语言:javascript
复制
Expected output:

[
  {
    "store": "5dc25092d972e71c3b3e6e87",
    "storeName": "Chad store",
    "carrierName": "LT&T",
    "averageSignalStrength": -180,
    "averageUploadSpeed": 7.66,
    "averageDownloadSpeed": 4.22,
    "totalSpeedTests": 2,
    "totalSpeedtestTesters": 1
  },
  {
    "store": "5dc25092d972e71c3b3e6e87",
    "storeName": "Chad store",
    "carrierName": "Sprint",
    "averageSignalStrength": -180,
    "averageUploadSpeed": 7.66,
    "averageDownloadSpeed": 4.22,
    "totalSpeedTests": 2,
    "totalSpeedtestTesters": 1
  },
  {
    "store": "5dc2899bfd1ea02f0fceb9ab",
    "storeName": "Bad store",
    "carrierName": "LT&T",
    "averageSignalStrength": -80,
    "averageUploadSpeed": 0,
    "averageDownloadSpeed": 0,
    "totalSpeedTests": 0,
    "totalSpeedtestTesters": 0
  }
]

任何帮助都是很好的:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-07 11:09:00

我使用了以下聚合。

$lookup连接信号和speedTests。

$unwind解构storeSignals数组字段。

$replaceRoot和$mergeRoot来塑造您想要的输出。

$ifNull将空平均值处理为0。

$setDifference用于计数不同的值。

您可以使用以下聚合:

代码语言:javascript
复制
db.store.aggregate([
  {
    $lookup: {
      from: "signals",
      localField: "id",
      foreignField: "store",
      as: "storeSignals"
    }
  },
  {
    $lookup: {
      from: "speedTests",
      localField: "id",
      foreignField: "store",
      as: "speedTests"
    }
  },
  {
    $unwind: {
      path: "$storeSignals",
      preserveNullAndEmptyArrays: true
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          "$storeSignals",
          {
            "store": "$_id",
            "storeName": "$name",
            "carrierName": "$carrierName",
            "speedTests": "$speedTests",
            "signalStrength": "$signalStrength",

          },

        ]
      }
    }
  },
  {
    $project: {
      _id: 0,
      store: "$store",
      storeName: "$storeName",
      carrierName: "$carrierName",
      averageSignalStrength: {
        $ifNull: [
          {
            $avg: "$signalStrength"
          },
          0
        ]
      },
      averageUploadSpeed: {
        $ifNull: [
          {
            $avg: "$speedTests.uploadSpeed"
          },
          0
        ]
      },
      averageDownloadSpeed: {
        $ifNull: [
          {
            $avg: "$speedTests.downloadSpeed"
          },
          0
        ]
      },
      totalSpeedTests: {
        $size: "$speedTests"
      },
      totalSpeedtestTesters: {
        "$size": {
          "$setDifference": [
            "$speedTests.employee",
            []
          ]
        }
      }
    }
  },

])

输出如下:

代码语言:javascript
复制
[
  {
    "averageDownloadSpeed": 7.66,
    "averageSignalStrength": -180,
    "averageUploadSpeed": 4.22,
    "carrierName": "LT\u0026T",
    "store": ObjectId("5a934e000102030405000005"),
    "storeName": "Chad store",
    "totalSpeedTests": 2,
    "totalSpeedtestTesters": 1
  },
  {
    "averageDownloadSpeed": 7.66,
    "averageSignalStrength": -180,
    "averageUploadSpeed": 4.22,
    "carrierName": "Sprint",
    "store": ObjectId("5a934e000102030405000005"),
    "storeName": "Chad store",
    "totalSpeedTests": 2,
    "totalSpeedtestTesters": 1
  },
  {
    "averageDownloadSpeed": 0,
    "averageSignalStrength": -80,
    "averageUploadSpeed": 0,
    "carrierName": "LT\u0026T",
    "store": ObjectId("5a934e000102030405000006"),
    "storeName": "Bad store",
    "totalSpeedTests": 0,
    "totalSpeedtestTesters": 0
  }
]

操场测试它是否工作:

https://mongoplayground.net/p/WTDPKEKGS1F

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58746035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档