简体   繁体   English

使用过滤器嵌入文档NoseJS进行Mongodb聚合

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM