【发布时间】:2013-11-22 12:59:49
【问题描述】:
我在 MongoDB 中有两个集合:
- 车辆
- 测试
Tests 包含评估分数,其中包括属性“_vehicle_id”
我需要退回最近 5 次测试中至少 3 次得分高于 70(存储为整数)的所有车辆(使用属性“unit_score”)。
我已经阅读了有关子文档、排序、限制等的信息,但我很难理解如何仅在 Mongo 中实现这一点。到目前为止,我的工作是检索所有人的最后 5 个结果,然后在 Python 中进行迭代,但是当我每 30 秒处理潜在的 10,000 个测试时,这非常低效......
所以我正在寻找一种方法让 MongoDB/PyMongo 仅返回具有超过 3 个匹配且 unit_score > 70 的车辆文档。
我目前有以下代码,它返回每个匹配车辆的 ObjectId(),但我希望它改为返回每个匹配车辆的 Vehicle 对象:
db.tests.aggregate([
{ "$match" : { 'statuscode' : '404', 'datetime' : { "$gte" : "2013-11-22 15:05:35" } } },
{ "$group" : { "_id" : "$_vehicle_id", "count" : { "$sum" : 1 }}},
{ "$match" : { "count" : { "$gt" : 3 } } }
])
日期将是动态的(最后 x 分钟),但现在它是静态的,用于测试目的。
我查看了“$project”,但我不确定这是否适合返回关联的对象。 _vehicle_id 是一个 bson ObjectId(),所以我希望它会像 db.vehicles.find_one("$_vehicle_id") 一样简单,但我担心不会……
感谢您的帮助。
【问题讨论】:
-
你看过使用
aggregate吗? -
我没有,@JohnnyHK... 综合阅读,我认为这将用于查找我的测试标准,按 _vehicle_id 分组,对我的匹配项求和,然后返回 _vehicle_ids 列表.有没有办法在一个查询中返回实际唯一的车辆?谢谢:)
-
还是使用 MapReduce 会更好?
-
您需要明确地将您希望包含在最终输出中的任何字段通过聚合管道的每个阶段。
aggregate通常比 map-reduce 快得多,因此您绝对希望尽可能避免使用 map-reduce。 -
非常感谢@JohnnyHK。我正在掌握这个概念,现在正在 Python Shell 中使用它。我刚刚发现了“$gte”和“$lte”,我认为这是拼图的最后一块......