需要加入mongodb的2个集合才能根据集合字段查找聚合数据

需要加入mongodb的2个集合才能根据集合字段查找聚合数据,mongodb,Mongodb,我将门店列表作为门店集合,其中仅包含门店基本详细信息 商店收藏: [ { “id”:“5dc25092d972e71c3b3e6e87”, “名称”:“乍得商店”, }, { “id”:“5dc2899bfd1ea02f0fceb9ab”, “名称”:“坏商店”, } ]我使用了以下聚合 $lookup连接信号和速度测试 $unwind解构storeSignals数组字段 $replaceRoot和$mergeRoot以形成所需的输出 $ifNull将null平均值处理为0 $setDiffe

我将门店列表作为门店集合,其中仅包含门店基本详细信息

商店收藏:
[
{
“id”:“5dc25092d972e71c3b3e6e87”,
“名称”:“乍得商店”,
},
{
“id”:“5dc2899bfd1ea02f0fceb9ab”,
“名称”:“坏商店”,
}

]
我使用了以下聚合

$lookup连接信号和速度测试

$unwind解构storeSignals数组字段

$replaceRoot和$mergeRoot以形成所需的输出

$ifNull将null平均值处理为0

$setDifference以计算不同的值

您可以使用以下聚合:

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",
            []
          ]
        }
      }
    }
  },

])
输出如下:

[
  {
    "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
  }
]
要测试其是否工作的操场:


我使用了以下聚合

$lookup连接信号和速度测试

$unwind解构storeSignals数组字段

$replaceRoot和$mergeRoot以形成所需的输出

$ifNull将null平均值处理为0

$setDifference以计算不同的值

您可以使用以下聚合:

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",
            []
          ]
        }
      }
    }
  },

])
输出如下:

[
  {
    "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
  }
]
要测试其是否工作的操场:


您需要包括您在另一个问题中提到的“速度测试”集合。@SuleymanSah我已经更新了集合。请注意,速度测试中也有承运人名称。您当前的答案很好,除非同一个存储区有多条相同运营商名称的记录,否则该存储区会重复。您需要包括您在另一个问题中提到的“速度测试”集合。@SuleymanSah我已更新了该集合。请注意,速度测试中也有承运人名称。您当前的答案可以正常工作,除非同一个商店有多条相同运营商名称的记录,然后该商店会重复。只需验证查询即可。看起来不错,但有一个问题。如果信号记录具有相同的网络载波,则该存储在响应中重复。@Prajwal数据中存在相同的信号正常吗?@Prajwal ok但输入文档中存在重复信号正常吗?我们不希望实际显示同一存储和载波的聚合值。我想我可以继续下去。谢谢你的帮助:)我已经更新了这里的速度测试集合。我们能在那里也应用同样的概念吗?速度测试记录中有航母的名字吗?@Prajwal也许你可以先试试。我将尝试删除输出中的重复信号,但我认为最好不要在输入中有重复信号。只是验证了查询。看起来不错,但有一个问题。如果信号记录具有相同的网络载波,则该存储在响应中重复。@Prajwal数据中存在相同的信号正常吗?@Prajwal ok但输入文档中存在重复信号正常吗?我们不希望实际显示同一存储和载波的聚合值。我想我可以继续下去。谢谢你的帮助:)我已经更新了这里的速度测试集合。我们能在那里也应用同样的概念吗?速度测试记录中有航母的名字吗?@Prajwal也许你可以先试试。我将尝试删除输出中的重复信号,但我认为最好不要在输入中有重复信号。