$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}}
在匹配聚合阶段之前的结果中,您没有任何结果与我突出显示的这些查询相匹配
我正在尝试获取“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}}
在匹配聚合阶段之前的结果中,您没有任何结果与我突出显示的这些查询相匹配