使用mongoose筛选器嵌入文档的Mongodb聚合

使用mongoose筛选器嵌入文档的Mongodb聚合,mongodb,mongoose,Mongodb,Mongoose,我正在与NodeJS和mongoose合作,并对两个系列进行汇总: 收集1(车站): 收集2(措施): 聚合完成后,将显示完全嵌入到集合中的文档,我只需要显示与attrname匹配的文档 如何在嵌入的文档中执行搜索?有可能只显示这些信息吗 我需要sensor_type只显示名称33的信息,因为当嵌入的文档显示该数据时,它是2的真实值,并且是错误的 错误代码: { "DatagreenhouseRecuperado":[ { "_id":33,

我正在与NodeJS和mongoose合作,并对两个系列进行汇总:

收集1(车站):

收集2(措施):

聚合完成后,将显示完全嵌入到集合中的文档,我只需要显示与attrname匹配的文档

如何在嵌入的文档中执行搜索?有可能只显示这些信息吗

我需要sensor_type只显示名称33的信息,因为当嵌入的文档显示该数据时,它是2的真实值,并且是错误的

错误代码:

    {
   "DatagreenhouseRecuperado":[
      {
         "_id":33,
         "medidas":[
            {
               "_id":"5ccacc61a0160f16c50f5a1b",
               "marca":"Metos",
               "modelo":"Estacion",
               "fabricante":"Metos",
               "id_station":[
                  999
               ],
               "sensor_type":[
                  {
                     "name":2,
                     "type":"clima",
                     "place":"interior",
                     "img":"assets/img/hum.png",
                     "name_comun":"Temperatura",
                     "medida":"%",
                     "interfaz":""
                  },
                  {
                     "name":33,
                     "type":"clima",
                     "place":"interior",
                     "img":"assets/img/hum.png",
                     "name_comun":"Hum. Relativa",
                     "medida":"%",
                     "interfaz":""
                  }
               ],
               "attrName":33,
               "attrValue":8888,
               "recvTimeTs":1588524826,
               "recvTime":"2020-05-03T18:53:46"
            }
         ],
         "count":1
      }
   ]
}
目标是:

{
   "DatagreenhouseRecuperado":[
      {
         "_id":33,
         "medidas":[
            {
               "_id":"5ccacc61a0160f16c50f5a1b",
               "marca":"Metos",
               "modelo":"Estacion",
               "fabricante":"Metos",
               "id_station":[
                  999
               ],
               "sensor_type":[
                  {
                     "name":33,
                     "type":"clima",
                     "place":"interior",
                     "img":"assets/img/hum.png",
                     "name_comun":"Hum. Relativa",
                     "medida":"%",
                     "interfaz":""
                  }
               ],
               "attrName":33,
               "attrValue":8888,
               "recvTimeTs":1588524826,
               "recvTime":"2020-05-03T18:53:46"
            }
         ],
         "count":1
      }
   ]
}
代码:

你好,谢谢你

编辑01解决方案

您好,这是对代码的改编:

{
        "$addFields": {
            "sensor.attrValue": "$attrValue", // Add attrValue to the sensors
            "sensor.attrName": "$attrName", // Add attrValue to the sensors
            "sensor.recvTimeTs": "$recvTimeTs", // Add attrName to the sensors
            "sensor.pruebas": "$name_comun", // Add attrName to the sensors
            "sensor.sensor_type": {
                $filter: {
                    input: '$sensor.sensor_type',
                    as: 'shape',
                    cond: { $eq: ['$$shape.name', '$attrName'] },
                }
            }
        }
    },

问题在于,在传感器类型中,它显示的是数据,而不是该对象的所有信息。如何添加其他字段?

基本上,所有代码都是正确的,您在该查找中所做的是匹配所有传感器,传感器类型数组中有一个名称为“XX”的传感器。lookup完成了它的工作,它返回所有匹配项,但是这些数组有额外的文档。当您匹配子文档时,它不会为您筛选它

只需在$project中筛选它们,或在$addFields中添加以下内容

"sensor.sensor_type": {
    "$filter": {
        "input": "$sensor.sensor_type",
        "as": "sensorType",
        "cond": { "$eq": ['$$sensorType.name', 33]}
    }
 }

您可以做的另一件事是更改$lookup,让let和pipeline在这个管道中进行匹配并投影数据。这是一种更干净、更好的方法。今天晚些时候,我也会用这个例子更新答案。

几个问题。第一个-为什么要运行第二个展开阶段?您可以在数组上运行匹配,而无需展开它,第二个问题,为什么不在查找中使用let和pipeline?所以所有这些都是很好的一个cleanHi,我不知道你可以在一个数组中进行匹配而不显示它。对于另一个,同样的事情也发生在我身上。您好,我的主要问题是sensor_type显示了包含嵌入文档的所有内容,而不是ID信息。我不确定我是否正确理解它,查看您上面写的内容以及您在评论中写的内容。您希望以不同的方式“投影”数据并仅显示名称字段,或者您说您缺少_id?在传感器类型中,您必须显示与名称匹配的传感器信息。现在显示所有嵌入的文档。例如,如果传感器类型内的attrName为33,则仅显示名称信息:33。而不是现在发生的2。我明白这是可以理解的。感谢您的帮助,我正在通过在addfiels中添加代码来测试解决方案,它给了我未定义变量sensorType的错误用法“你好,我还在努力寻找解决方案有什么帮助吗?@Manolait检查更新的代码,我缺少过滤器,以为你会自己发现你好,我修改了帖子,我做过滤器时遇到问题,它只显示一个值,而不是嵌入文档的整个对象我已经解决了问题,正在输入sensor.sensor_type.name,因此仅输出该值。谢谢你的帮助
     function getDataSensorGreenhouseLastDataPruebas(req, res) {
        var array = req.params.nombresensores;
        var id_station = array.split(',');
        var array2 = req.params.sensores;
        //var sensor = array2.split(',');
        // var id_station = req.params.id_station;
        console.log('id_station: ' + id_station);
        Datagreenhouse.aggregate([
            { "$match": { "id_station": { "$in": [191, 999] }, "attrName": { "$in": [2, 33] } } },
            { "$sort": { "recvTime": -1 } },
            {
                "$group": {
                    "_id": "$id_station",
                    "latest": { "$first": "$$ROOT" },
                }
            },
            {
                "$project": {
                    "_id": 1,
                    "id_station": "$latest.id_station",
                    "attrName": "$latest.attrName",
                    "attrValue": "$latest.attrValue",
                    "recvTimeTs": "$latest.recvTimeTs",
                    "recvTime": "$latest.recvTime"
                }
            },
            {
                "$lookup": {
                    "from": "station_types",
                    "localField": "id_station", // local field in measurements collection
                    "foreignField": "id_station", //foreign field from sensors collection
                    "as": "sensor"
                }
            },
            { "$unwind": "$sensor" },
            // { "$match": { "sensor.sensor_type.name": 2 } },
            {
                "$addFields": {
                    "sensor.attrName": "$attrName", // Add attrName to the sensors
                    "sensor.attrValue": "$attrValue", // Add attrValue to the sensors
                    "sensor.recvTimeTs": "$recvTimeTs",
                    "sensor.recvTime": "$recvTime"

                }
            },
            {
                "$group": {
                    "_id": "$id_station", // Group by time
                    "medidas": { "$push": "$sensor" }, // Collect measurements
                    "count": { "$sum": 1 } // Count measurements
                }
            },

        ], (err, DatagreenhouseRecuperado) => {
            if (err) return res.status(500).send({ message: 'Error al realizar la peticion' + err })
            if (!DatagreenhouseRecuperado) return res.status(404).send({ message: 'Error el usuario no existe' })
            console.log('Ordenado: ' + JSON.stringify(DatagreenhouseRecuperado));

            /*DatagreenhouseRecuperado.sort(function(a, b) {
                return (a._id - b._id)
            })*/
            res.status(200).send({ DatagreenhouseRecuperado })
        })
    }
{
        "$addFields": {
            "sensor.attrValue": "$attrValue", // Add attrValue to the sensors
            "sensor.attrName": "$attrName", // Add attrValue to the sensors
            "sensor.recvTimeTs": "$recvTimeTs", // Add attrName to the sensors
            "sensor.pruebas": "$name_comun", // Add attrName to the sensors
            "sensor.sensor_type": {
                $filter: {
                    input: '$sensor.sensor_type',
                    as: 'shape',
                    cond: { $eq: ['$$shape.name', '$attrName'] },
                }
            }
        }
    },
"sensor.sensor_type": {
    "$filter": {
        "input": "$sensor.sensor_type",
        "as": "sensorType",
        "cond": { "$eq": ['$$sensorType.name', 33]}
    }
 }