使用$ lookup和$ group来聚合数据

时间:2016-12-28 08:15:25

标签: node.js mongodb aggregation-framework

我正在聚合一个大数据,我需要根据它们的类型对数据进行分组,我还需要从另一个collections.inside $ group中查找数据,我想查找我的查找数据。 我的聚合代码如下:

NotificationSchema.aggregate([{
  $match: condition
}, {
  $group: {
    _id: "$type",
    details: {
      $push: "$$ROOT"
    },
    count: {
      $sum: 1
    }
  }
}, {
  $sort: {
    _id: -1
  }
}, {

  $lookup: {
    from: "vehicles",
    localField: "details.device_id",
    foreignField: "device_id",
    as: "vehicle"
  }
}], function(err, result) {
  if (err) {
    res.status(500);
    return res.json({
      result: err
    });
  }
  console.log('res', result[0].details[0]);
  res.json({
    result: result
  });
});

如果我删除或评论$ group代码我使用Vehicle数组获取数据但是使用$ group我得到车辆数组为空,因为我在数据库中的记录中只有两种类型,我得到两个空的车辆数组。但我有102条记录所以我需要102个车辆阵列我怎么能得到这样的结果。 我现在在控制台得到的是

res [ { _id: 'Vehicle Delay Alert!',
    details: 
     [ [Object],
       ....57 object...
       [Object] ],
    count: 57,
    vehicle: [] },

并且在每个物体里面我找不到车辆阵列所以我希望从这里移除车辆阵列并获得从每个物体内的$ lookup生成的车辆阵列。 任何建议都非常感谢。

1 个答案:

答案 0 :(得分:0)

来自$lookup的来自数组的details.device_id。要从常规字段中$lookup,您可以$lookup之后放置$match

NotificationSchema.aggregate([{
    $match: condition
}, {
    $lookup: {
        from: "vehicles",
        localField: "device_id",
        foreignField: "device_id",
        as: "vehicle"
    }
}, {
    $group: {
        _id: "$type",
        details: {
            $push: "$$ROOT"
        },
        count: {
            $sum: 1
        }
    }
}, {
    $sort: {
        _id: -1
    }
}])