我试图弄明白我想做什么甚至可能在Mongodb中。我对各种有关实现我需要的方法的建议持开放态度。
目前,我有2个系列:
车辆(包含车辆数据,如品牌和型号。这些数据可能是高度非结构化的,这就是我为此而转向Mongodb的原因)
观看次数(仅包含一个IP,观察车辆的日期/时间以及vehicle_id。可能有数千个观看次数)
我需要返回两个日期之间有视图的车辆列表。该列表应包括视图数量。除了任何常见的车辆领域之外,我还需要能够按照视图的数量进行排序。因此,需要明确的是,如果一辆车有1000次观看,但在给定日期之间只有500次观看,则该次数应该返回500次。
我非常确定我可以在MySQL中没有任何问题的情况下执行此查询 - 然而,尝试将车辆数据存储在MySQL中一直是一个令人头痛的问题,而且我很乐意转移到Mongo我可以轻松添加新数据字段,不用担心我的数据库结构。
你们都有什么想法? TIA!
答案 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.
然后喘口气:)
我希望能有所帮助。如果你知道我做的更好的方式,那么我愿意接受改进的建议。