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