在 MongoDB 中使用 `$unwind` 对不同 `$sum` 输出的疑问
Using `$unwind` in MongoDB doubts of different `$sum` outputs
我对使用 $unwind...
有疑问
首先,这是我的 collection“Provincias.json”,它存储有关西班牙地区的信息(简短示例):
{
_id: ObjectId("62095151245a59e4bda99e9a"),
Nombre: 'Soria',
CA: 'Castilla y León',
Superficie: 10306,
Datos: [
{ Anyo: 2015, Valor: 91780 },
{ Anyo: 2014, Valor: 92630 },
{ Anyo: 2013, Valor: 93575 },
{ Anyo: 2012, Valor: 94463 },
..... ]
其中CA是州名,Nombre县名,Superficie县面和 Datos 每年的人口。
好吧,我正在尝试“查询”returns 按 CA 分组的信息以及总表面和最大和最小人口密度之间的差异。
我的表达如下:
db.ProvinciasPEC1.aggregate([
{$unwind: "$Datos"},
{$group: {
"_id": "$CA",
"totSuperficie": {$sum:"$Superficie"},
"PoblacionMaxima": {$max: "$Datos.Valor"},
"PoblacionMinima": {$min: "$Datos.Valor"}}},
{$project: {
"_id": 1,"totSuperficie": 1,
"totPoblacion": 1,
"diffDensidad": {
$divide: [
{$subtract: ["$PoblacionMaxima", "$PoblacionMinima"]} , "$totSuperficie"
]
}
}
},
{$sort: {"diffDensidad":-1}},
{$out:"CAM_Densidad"}
])
我 returns 我是这样的:
但我不知道为什么总Surface是错误的。
使用以下表达式,我得到具有适当总面积的州:
db.ProvinciasPEC1.aggregate([{$group: {"_id": "$CA", "totSuperficie": {$sum:"$Superficie"}}},{$out:"CAM_Densidad"}])
那个returns:
拜托,有什么提示可以弄清楚我做错了什么吗?我认为与 $unwind 有关,但不确定,
非常感谢!
也许是这样的:
db.collection.aggregate([
{
$unwind: "$Datos"
},
{
$group: {
"_id": "$CA",
"totSuperficie": {
$first: "$Superficie"
},
"PoblacionMaxima": {
$max: "$Datos.Valor"
},
"PoblacionMinima": {
$min: "$Datos.Valor"
}
}
},
{
$project: {
"_id": 1,
"totSuperficie": 1,
"totPoblacion": 1,
"diffDensidad": {
$divide: [
{
$subtract: [
"$PoblacionMaxima",
"$PoblacionMinima"
]
},
"$totSuperficie"
]
}
}
},
{
$sort: {
"diffDensidad": -1
}
},
{
$out: "CAM_Densidad"
}
])
解释:
- 放松 Datos
- 对每个 CA 进行分组(但保留 Superficie,因为它对所有展开的 Datos 都是相同的值,所以如果你对它们求和,你将根据每个 CA 的 Datos 数量得到不同的总和)
- 项目
- 按差异排序
- 输出到输出集合
这是一种方法。确定每个文件min/maxValor
,然后$group
由CA
.
db.collection.aggregate([
{
"$set": {
"maxV": {
"$max": "$Datos.Valor"
},
"minV": {
"$min": "$Datos.Valor"
}
}
},
{
"$group": {
"_id": "CA",
"totMaxV": {
"$max": "$maxV"
},
"totMinV": {
"$min": "$minV"
},
"totSf": {
"$sum": "$Superficie"
}
}
},
{
"$project": {
"diffDensidad": {
"$divide": [
{
"$subtract": [
"$totMaxV",
"$totMinV"
]
},
"$totSf"
]
},
"CA": "$_id",
"_id": 0
}
}
])
在 mongoplayground.net 上试用。
我对使用 $unwind...
首先,这是我的 collection“Provincias.json”,它存储有关西班牙地区的信息(简短示例):
{
_id: ObjectId("62095151245a59e4bda99e9a"),
Nombre: 'Soria',
CA: 'Castilla y León',
Superficie: 10306,
Datos: [
{ Anyo: 2015, Valor: 91780 },
{ Anyo: 2014, Valor: 92630 },
{ Anyo: 2013, Valor: 93575 },
{ Anyo: 2012, Valor: 94463 },
..... ]
其中CA是州名,Nombre县名,Superficie县面和 Datos 每年的人口。
好吧,我正在尝试“查询”returns 按 CA 分组的信息以及总表面和最大和最小人口密度之间的差异。
我的表达如下:
db.ProvinciasPEC1.aggregate([
{$unwind: "$Datos"},
{$group: {
"_id": "$CA",
"totSuperficie": {$sum:"$Superficie"},
"PoblacionMaxima": {$max: "$Datos.Valor"},
"PoblacionMinima": {$min: "$Datos.Valor"}}},
{$project: {
"_id": 1,"totSuperficie": 1,
"totPoblacion": 1,
"diffDensidad": {
$divide: [
{$subtract: ["$PoblacionMaxima", "$PoblacionMinima"]} , "$totSuperficie"
]
}
}
},
{$sort: {"diffDensidad":-1}},
{$out:"CAM_Densidad"}
])
我 returns 我是这样的:
但我不知道为什么总Surface是错误的。
使用以下表达式,我得到具有适当总面积的州:
db.ProvinciasPEC1.aggregate([{$group: {"_id": "$CA", "totSuperficie": {$sum:"$Superficie"}}},{$out:"CAM_Densidad"}])
那个returns:
拜托,有什么提示可以弄清楚我做错了什么吗?我认为与 $unwind 有关,但不确定,
非常感谢!
也许是这样的:
db.collection.aggregate([
{
$unwind: "$Datos"
},
{
$group: {
"_id": "$CA",
"totSuperficie": {
$first: "$Superficie"
},
"PoblacionMaxima": {
$max: "$Datos.Valor"
},
"PoblacionMinima": {
$min: "$Datos.Valor"
}
}
},
{
$project: {
"_id": 1,
"totSuperficie": 1,
"totPoblacion": 1,
"diffDensidad": {
$divide: [
{
$subtract: [
"$PoblacionMaxima",
"$PoblacionMinima"
]
},
"$totSuperficie"
]
}
}
},
{
$sort: {
"diffDensidad": -1
}
},
{
$out: "CAM_Densidad"
}
])
解释:
- 放松 Datos
- 对每个 CA 进行分组(但保留 Superficie,因为它对所有展开的 Datos 都是相同的值,所以如果你对它们求和,你将根据每个 CA 的 Datos 数量得到不同的总和)
- 项目
- 按差异排序
- 输出到输出集合
这是一种方法。确定每个文件min/maxValor
,然后$group
由CA
.
db.collection.aggregate([
{
"$set": {
"maxV": {
"$max": "$Datos.Valor"
},
"minV": {
"$min": "$Datos.Valor"
}
}
},
{
"$group": {
"_id": "CA",
"totMaxV": {
"$max": "$maxV"
},
"totMinV": {
"$min": "$minV"
},
"totSf": {
"$sum": "$Superficie"
}
}
},
{
"$project": {
"diffDensidad": {
"$divide": [
{
"$subtract": [
"$totMaxV",
"$totMinV"
]
},
"$totSf"
]
},
"CA": "$_id",
"_id": 0
}
}
])
在 mongoplayground.net 上试用。