具有过滤器嵌入式文档NoseJS的Mongodb聚合

时间:2019-06-04 17:32:39

标签: node.js mongodb mongoose

我正在查询我的API,并且我将一组站作为参数传递

  

http://本地主机:3790 / api / getSensorIdstation / 191,1123

我得到的答案如下:

   {
   "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":""
         }
      }
   ]
}

在这种情况下,我只需要在191和1123中出现的id_station上正在查询的ID,而不需要其余的ID。

我正在测试过滤器,但无法正常工作。

这是我的代码:

   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 })
            })
    }

结果应为:

{
   "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":""
         }
      }
   ]
}
  

编辑

添加过滤器代码: 但它不返回其余字段,仅返回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
                }
            }

        ],

1 个答案:

答案 0 :(得分:0)

最后,经过几次测试,我找到了解决方案,在项目中添加了一个过滤器,并添加了其余字段。

 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 })
            })
    }

希望有帮助。