使用$lookup统计MongoDB关联变量数量的聚合难题
MongoDB聚合管道修正:关联设备的变量统计与名称展示
问题分析
你的聚合管道存在两个关键问题:
- 字段名称不匹配:在
$project阶段使用了name: 1,但你的devices集合中存储设备名称的字段是deviceName,这会导致该字段返回null。 - 丢失变量名称信息:用
$size直接覆盖deviceVariables数组,虽然得到了数量,但丢失了所有变量的名称,不符合你同时获取变量名称的需求。
修正后的聚合管道
以下管道会返回设备完整信息、关联变量的数量,以及所有变量的名称列表:
[ { $match: { _id: ObjectId('65a6235d484c162c28865db4') } }, { $lookup: { from: 'variables', localField: '_id', foreignField: 'deviceId', as: 'deviceVariables' } }, { $project: { _id: 1, deviceName: 1, // 修正字段名称 variableCount: { $size: '$deviceVariables' }, // 单独统计变量数量 variableNames: { $map: { // 提取所有变量的名称 input: '$deviceVariables', as: 'var', in: '$$var.name' } } } } ]
预期输出结果
执行上述管道后,会得到如下格式的文档:
{ "_id": ObjectId("65a6235d484c162c28865db4"), "deviceName": "A", "variableCount": 2, "variableNames": ["current", "temp"] }
额外优化建议
如果只需要变量数量和名称,不需要完整的变量文档,也可以在$lookup阶段使用带管道的关联查询,提前过滤和处理变量数据,减少数据传输量:
[ { $match: { _id: ObjectId('65a6235d484c162c28865db4') } }, { $lookup: { from: 'variables', let: { deviceId: '$_id' }, pipeline: [ { $match: { $expr: { $eq: ['$deviceId', '$$deviceId'] } } }, { $project: { name: 1, _id: 0 } } // 只保留变量名称 ], as: 'variableNames' } }, { $addFields: { variableCount: { $size: '$variableNames' }, variableNames: { $map: { // 把对象数组转为纯名称数组 input: '$variableNames', as: 'var', in: '$$var.name' } } } }, { $project: { _id: 1, deviceName: 1, variableCount: 1, variableNames: 1 } } ]
内容的提问来源于stack exchange,提问作者anonymous_33008899
相关产品推荐
相关产品推荐

