在 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"
  }
])

解释:

  1. 放松 Datos
  2. 对每个 CA 进行分组(但保留 Superficie,因为它对所有展开的 Datos 都是相同的值,所以如果你对它们求和,你将根据每个 CA 的 Datos 数量得到不同的总和)
  3. 项目
  4. 按差异排序
  5. 输出到输出集合

playground

这是一种方法。确定每个文件min/maxValor,然后$groupCA.

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 上试用。