[英]Mongodb aggregation with filter embedded document NoseJS
I'm consulting my API and I pass as parameters an array of stations 我正在咨询我的API,我作为参数传递一系列电台
http: // localhost: 3790 / api / getSensorIdstation / 191,1123
http:// localhost:3790 / api / getSensorIdstation / 191,1123
The answer I get is the following: 我得到的答案如下:
{
"Station_types":[
{
"_id":"5cc85899a0160f16c50f4199",
"marca":"Hortisis",
"modelo":"Estacion",
"fabricante":"Hortisis",
"id_station":[
"191",
"457",
"459",
"463",
"465",
"426",
"424"
],
"sensor_type":{
"name":"2",
"type":"clima",
"place":"interior",
"img":"assets/img/temp.png",
"name_comun":"Temp. Ambiente",
"medida":"ºC",
"interfaz":"greenhouse"
}
},
{
"_id":"5cc85899a0160f16c50f4199",
"marca":"Hortisis",
"modelo":"Estacion",
"fabricante":"Hortisis",
"id_station":[
"191",
"457",
"459",
"463",
"465",
"426",
"424"
],
"sensor_type":{
"name":"3",
"type":"clima",
"place":"interior",
"img":"assets/img/hum.png",
"name_comun":"Hum. Relativa",
"medida":"%",
"interfaz":""
}
},
{
"_id":"5cebaa26c6b02a54c6a3f782",
"marca":"Sigfox 8DF004 CO2 Sensirion (L1 214)",
"modelo":"Sigfox 8DF004 CO2 Sensirion (L1 214)",
"fabricante":"Sigfox 8DF004 CO2 Sensirion (L1 214)",
"id_station":[
"1123"
],
"sensor_type":{
"name":"3",
"type":"clima",
"place":"interior",
"img":"assets/img/hum.png",
"name_comun":"Hum. Relativa",
"medida":"%",
"interfaz":""
}
},
{
"_id":"5cebaa26c6b02a54c6a3f782",
"marca":"Sigfox 8DF004 CO2 Sensirion (L1 214)",
"modelo":"Sigfox 8DF004 CO2 Sensirion (L1 214)",
"fabricante":"Sigfox 8DF004 CO2 Sensirion (L1 214)",
"id_station":[
"1123"
],
"sensor_type":{
"name":"43",
"type":"clima",
"place":"interior",
"img":"assets/img/humidity.png",
"name_comun":"Def. vapor de presión",
"medida":"kPa",
"interfaz":""
}
}
]
}
I would need only the ID that is being consulted in this case on id_station appear in 191 and 1123, not the rest. 我只需要在id_station上查询的ID在191和1123中出现,而不是其余的。
I am testing with the filters but it does not work correctly. 我正在测试过滤器,但它无法正常工作。
This is my code: 这是我的代码:
function getSensorIdstation(req, res) {
var array = req.params.id_station;
var arr = array.split(',');
Station_types.aggregate([
{ "$match": { "id_station": { "$in": arr } } },
{ "$unwind": "$sensor_type" },
],
(err, Station_types) => {
if (err) return res.status(500).send({ message: 'Error al realizar la peticion' })
if (!Station_types) return res.status(404).send({ message: 'Error el usuario no existe' })
res.status(200).send({ Station_types })
})
}
the result should be this: 结果应该是这样的:
{
"Station_types":[
{
"_id":"5cc85899a0160f16c50f4199",
"marca":"Hortisis",
"modelo":"Estacion",
"fabricante":"Hortisis",
"id_station":[
"191"
],
"sensor_type":{
"name":"2",
"type":"clima",
"place":"interior",
"img":"assets/img/temp.png",
"name_comun":"Temp. Ambiente",
"medida":"ºC",
"interfaz":"greenhouse"
}
},
{
"_id":"5cc85899a0160f16c50f4199",
"marca":"Hortisis",
"modelo":"Estacion",
"fabricante":"Hortisis",
"id_station":[
"191"
],
"sensor_type":{
"name":"3",
"type":"clima",
"place":"interior",
"img":"assets/img/hum.png",
"name_comun":"Hum. Relativa",
"medida":"%",
"interfaz":""
}
},
{
"_id":"5cebaa26c6b02a54c6a3f782",
"marca":"Sigfox 8DF004 CO2 Sensirion (L1 214)",
"modelo":"Sigfox 8DF004 CO2 Sensirion (L1 214)",
"fabricante":"Sigfox 8DF004 CO2 Sensirion (L1 214)",
"id_station":[
"1123"
],
"sensor_type":{
"name":"3",
"type":"clima",
"place":"interior",
"img":"assets/img/hum.png",
"name_comun":"Hum. Relativa",
"medida":"%",
"interfaz":""
}
},
{
"_id":"5cebaa26c6b02a54c6a3f782",
"marca":"Sigfox 8DF004 CO2 Sensirion (L1 214)",
"modelo":"Sigfox 8DF004 CO2 Sensirion (L1 214)",
"fabricante":"Sigfox 8DF004 CO2 Sensirion (L1 214)",
"id_station":[
"1123"
],
"sensor_type":{
"name":"43",
"type":"clima",
"place":"interior",
"img":"assets/img/humidity.png",
"name_comun":"Def. vapor de presión",
"medida":"kPa",
"interfaz":""
}
}
]
}
EDIT
编辑
add filter code: but it does not return the rest of fields, only the id_station 添加过滤器代码:但它不返回其余字段,只返回id_station
Station_types.aggregate([
{ "$match": { "id_station": { "$in": arr } } },
{ "$unwind": "$sensor_type" },
{
$project: {
sensor_type: {
$filter: {
input: '$id_station',
as: 'shape',
cond: { $in: ['$$shape', arr] }
}
},
_id: 0
}
}
],
In the end I found the solution after several tests, added a filter within the project and added the rest of the fields. 最后,我在几次测试后找到了解决方案,在项目中添加了一个过滤器,并添加了其余的字段。
function getSensorIdstation(req, res) {
var array = req.params.id_station;
console.log(array);
var arr = array.split(',');
console.log(arr);
Station_types.aggregate([
{ "$match": { "id_station": { "$in": arr } } },
{ "$unwind": "$sensor_type" },
{
$project: {
_id: 0,
id_station: {
$filter: {
input: '$id_station',
as: 'shape',
cond: { $in: ['$$shape', arr] }
}
},
marca: "$marca",
modelo: "$modelo",
fabricante: "$fabricante",
sensor_type: {
name: "$sensor_type.name",
type: "$sensor_type.type",
place: "$sensor_type.place",
img: "$sensor_type.img",
name_comun: "$sensor_type.name_comun",
medida: "$sensor_type.medida",
interfaz: "$sensor_type.interfaz"
}
}
}
],
(err, Station_types) => {
if (err) return res.status(500).send({ message: 'Error al realizar la peticion' })
if (!Station_types) return res.status(404).send({ message: 'Error el usuario no existe' })
/*SensorRecuperado.sort(function(a, b) {
return b.name_comun.localeCompare(a.name_comun);
})*/
res.status(200).send({ Station_types })
})
}
Hope that helps. 希望有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.