$DatefromString MongoDB & 获取文档

$DatefromString MongoDB & get documents

我正在尝试获取“location_id:1”中湿度值最小的5个文档。但仅限周一至周五和 8 a.m。到 6 p.m。集合 db.datos_sensores2 中的文档如下:

{
    "_id" : ObjectId("609c2c2d420a73728827e87f"),
    "timestamp" : ISODate("2020-07-01T02:15:00Z"),
    "sensor_id" : 1,
    "location_id" : 1,
    "medidas" : [
        {
            "tipo_medida" : "Temperatura",
            "valor" : 14.03,
            "unidad" : "ºC"
        },
        {
            "tipo_medida" : "Humedad_relativa",
            "valor" : 84.32,
            "unidad" : "%"
        }
    ]
}

{
    "_id" : ObjectId("609c2c2d420a73728827e880"),
    "timestamp" : ISODate("2020-07-01T02:15:00Z"),
    "sensor_id" : 2,
    "location_id" : 1,
    "medidas" : [
        {
            "tipo_medida" : "Emision_CO2",
            "valor" : 1.67,
            "unidad" : "gCO2/m2"
        },
        {
            "tipo_medida" : "Consumo_electrico",
            "valor" : 0.00155,
            "unidad" : "kWh/m2"
        }
    ]
}

我写了这个:

db.datos_sensores2.aggregate([
    {
       $project:{
              timestamp:{$dateFromString:{dateString:'$timestamp'}},"_id":0, "medidas":{$slice:["$medidas",-1]},"location_id":1}
    },
    {
      $add-Fields:{dia_semana:{$dayOfWeek:"$timestamp"},Hora:{$hour:"$timestamp"}}
    },
    {
      $match:{'medidas.tipo_medida': "Humedad", "location_id":1}
    },
    {
      $match:{$and:[{'dia_semana':{$in:[2,3,4,5,6]},'Hora':{$gt:8, $lt:18}}]}
    },
    {$sort:{"medidas.valor":1}},{$limit:5}])

但是什么也没发生....

**日期字段是字符串,这就是我使用 $DatefromString

的原因

我更改了您的查询并修复了一些问题 首先删除 DatefromString

db.collection.aggregate([
  {
    $project: {
      timestamp: 1,
      _id: 0,
      "medidas": {
        $slice: [
          "$medidas",
          -1
        ]
      },
      "location_id": 1
    }
  },
  {
    $addFields: {
      dia_semana: {
        $dayOfWeek: "$timestamp"
      },
      Hora: {
        $hour: "$timestamp"
      }
    }
  },
  {
    $match: {
      "medidas.tipo_medida": "Humedad",
      "location_id": 1
    }
  },
  {
    $match: {
      $and: [
        {
          "dia_semana": {
            $in: [
              2,
              3,
              4,
              5,
              6
            ]
          },
          "Hora": {
            $gt: 8,
            $lt: 18
          }
        }
      ]
    }
  },
  {
    $sort: {
      "medidas.valor": 1
    }
  },
  {
    $limit: 5
  }
])

在检查您的查询后,此聚合将 return 这

 {
        $project: {
          timestamp: 1,
          _id: 0,
          "medidas": {
            $slice: [
              "$medidas",
              -1
            ]
          },
          "location_id": 1
        }
      },
      {
        $addFields: {
          dia_semana: {
            $dayOfWeek: "$timestamp"
          },
          Hora: {
            $hour: "$timestamp"
          }
        }
      },

结果:

[
  {
    "Hora": 2,
    "dia_semana": 4,
    "location_id": 1,
    "medidas": [
      {
        "tipo_medida": "Humedad_relativa",
        "unidad": "%",
        "valor": 84.32
      }
    ],
    "timestamp": ISODate("2020-07-01T02:15:00Z")
  },
  {
    "Hora": 2,
    "dia_semana": 4,
    "location_id": 1,
    "medidas": [
      {
        "tipo_medida": "Consumo_electrico",
        "unidad": "kWh/m2",
        "valor": 0.00155
      }
    ],
    "timestamp": ISODate("2020-07-01T02:15:00Z")
  }
]

在这个结果中,我们没有将匹配阶段添加到管道中,如果您看到 由于多种原因

,你的比赛没有select任何结果

1- $match:{'medidas.tipo_medida': "Humedad"}

2-'Hora':{$gt:8, $lt:18}} 在匹配聚合阶段之前的结果中,您没有任何结果与我突出显示的这些查询相匹配