基于Mongodb关系的聚合和排序

时间:2017-10-18 08:53:22

标签: mongodb

我试图弄明白我想做什么甚至可能在Mongodb中。我对各种有关实现我需要的方法的建议持开放态度。

目前,我有2个系列:

车辆(包含车辆数据,如品牌和型号。这些数据可能是高度非结构化的,这就是我为此而转向Mongodb的原因)

观看次数(仅包含一个IP,观察车辆的日期/时间以及vehicle_id。可能有数千个观看次数)

我需要返回两个日期之间有视图的车辆列表。该列表应包括视图数量。除了任何常见的车辆领域之外,我还需要能够按照视图的数量进行排序。因此,需要明确的是,如果一辆车有1000次观看,但在给定日期之间只有500次观看,则该次数应该返回500次。

我非常确定我可以在MySQL中没有任何问题的情况下执行此查询 - 然而,尝试将车辆数据存储在MySQL中一直是一个令人头痛的问题,而且我很乐意转移到Mongo我可以轻松添加新数据字段,不用担心我的数据库结构。

你们都有什么想法? TIA!

1 个答案:

答案 0 :(得分:0)

事实证明,这是完全可能的。我花了很长时间才解决这个问题,因此我将其发布以供将来的谷歌搜索...

db.statistics.aggregate({ 
  $match: { 
    branch_id: { $in: [14] } 
  } 
}, { 
  $lookup: { 
    from: 'vehicles', localField: 'vehicle_id', foreignField: '_id', as: 'vehicle' 
  } 
}, { 
  $group: { 
    _id: "$vehicle_id", 
    count: { $sum: 1 }, 
    vehicleObject: { $first: "$vehicle" } 
  } 
}, { $unwind: "$vehicleObject" }, {
  $project: {
    daysInStock: { $subtract: [ new Date(), "$vehicleObject.date_assigned" ] },
    vehicleObject: 1,
    count: 1
  }
}, { $sort: { count: -1 } }, { $limit: 10 });

解释上述内容: Mongodb聚合框架是这种复杂查询的前进方向。首先,我运行$ match来过滤记录。然后,我们使用$ lookup来获取车辆记录。值得一提的是,这里有多对一的关系(很多统计数据,每个都有一辆车)。然后,我可以对vehicle_id字段进行分组,这将使我能够返回每辆车的一条记录,并计算该组中的统计数量。由于它是一个组,我们现在在每组中都有相同车辆文档的大量副本,因此我只将第一个添加到vehicleObject变量中。这样会很好,但$ first往往会返回一个带有单个条目的数组(在我看来毫无意义),所以我添加了$ unwind阶段来拉出实际车辆。然后我添加了一个$ project阶段来计算一个额外的字段,按计数降序排序并将结果限制为10.

然后喘口气:)

我希望能有所帮助。如果你知道我做的更好的方式,那么我愿意接受改进的建议。