需要加入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也许你可以先试试。我将尝试删除输出中的重复信号,但我认为最好不要在输入中有重复信号。