【问题标题】:MongoDb aggregation query: for every array count the number of properties of nested objectMongoDb 聚合查询:为每个数组计算嵌套对象的属性数
【发布时间】:2020-09-14 23:50:30
【问题描述】:

我有以下结构的文档:

"_id" : "AQ106_2020-09-12T09",
"date" : "2020-09-12T09:00:00.000Z",
"station" : {
    "name" : "AQ106",
    "loc" : {
        "type" : "Point",
        "coordinates" : [
            14.339263,
            40.814224
        ]
    },
    "properties" : {
        
    }
},
"samples" : [
    {
        "t" : ISODate("2020-09-12T11:02:00.000+02:00"),
        "data" : {
            "pm1_mg_m3" : 2.7,
            "pm2_5_mg_m3" : 4.6,
            "pm10_mg_m3" : 12,
            "P0" : 152,
            "P1" : 16,
            "P2" : 4.7,
            "P3" : 0.8,
            "P4" : 0.86,
            "P5" : 0.6,
            "P6" : 0.28,
            "P7" : 0.152,
            "P8" : 0.094,
            "P9" : 0.092,
            "P10" : 0.019,
            "P11" : 0,
            "P12" : 0,
            "P13" : 0.0188,
            "P14" : 0,
            "P15" : 0,
            "P16" : 0,
            "P17" : 0,
            "P18" : 0,
            "P19" : 0,
            "P20" : 0,
            "P21" : 0,

                "P22" : 0,
                "P23" : 0,
                "temp_celsius" : 32.59,
                "humRelPercent" : 34,
                "press_mBar" : 1010.79,
                "CO2mA" : 4,
                "NO2_WE_mV" : 226.419,
                "NO2_AE_mV" : 229.553,
                "OX_WE_mV" : 252.287,
                "OX_AE_mV" : 220.419,
                "CO_WE_mV" : 509.077,
                "AE_WE_mV" : 348.51,
                "batt_V" : 13.5,
                "source_V" : 17.6
            }
        },
        .... additional arrays
}

集合中的每个文档都有一个 samples 字段,它是一个对象数组,每个字段都有一个 ISODate 类型的 t 字段和一个包含传感器读数的对象类型的 data 字段。 我想为samples 中的每个元素计算属性数量到对象samples.data 中,并过滤具有此计数== N 的文档。 怎么能这样做? 谢谢。

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    您需要做一个小改动,即使用filter 而不是map

    {
        $project: {
          station: "$station.name",
          "n": {
            $filter: {
              input: "$samples.data",
              cond: {
                $eq: [
                  {
                    $size: {
                      "$objectToArray": "$$this"
                    }
                  },
                  39
                ]
              }
            }
          }
        }
      }
    

    工作Mongo playground

    【讨论】:

    • 谢谢,但它没有按预期工作。如果您只将另一个具有少于 39 个属性的文档添加到 samples.data 中,它会返回两个文档。见here
    • @EanX mongoplayground.net/p/MJJdTm1wHxb 这对您有帮助吗?
    【解决方案2】:

    我使用聚合框架部分地弄清楚了:

    db.collection.aggregate([{$project: {
      station:'$station.name',
      n:{$map:
      {
        input:"$samples.data",
        as:"vals",
        in:  {
            $size: {
              "$objectToArray": "$$vals"
            }
          }
    
          }}
    }}])
    

    但是如何过滤文档呢?

    【讨论】:

      猜你喜欢
      • 2021-08-13
      • 1970-01-01
      • 2018-09-10
      • 2015-03-10
      • 2020-01-24
      • 2020-10-29
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      相关资源
      最近更新 更多