【问题标题】:MongoDB / PyMongo return documents that match another document groupingMongoDB / PyMongo 返回与另一个文档分组匹配的文档
【发布时间】:2013-11-22 12:59:49
【问题描述】:

我在 MongoDB 中有两个集合:

  1. 车辆
  2. 测试

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”,我认为这是拼图的最后一块......

标签: python mongodb pymongo


【解决方案1】:

MongoDB 不支持连接,因此单个 MongoDB 查询(无论是 find 还是 aggregate)只能访问单个集合中的文档。

因此,在这种情况下,您必须跟进您的 test.aggregate 调用,该调用使用 db.vehicles.find({_id: {$in: vehicle_ids}}) 查询获取车辆 ID,以获取这些 ID 的车辆文档,其中 vehicle_ids 是您构建的 ID 数组aggregate 结果。

【讨论】:

  • 这似乎不符合我的要求,好像我理解正确,$first 只显示组的第一项的属性,这将是 Test 的实例,而不是 Vehicle,因此,如果没有“颜色”和“模型”作为测试文档的一部分,我们将无法访问 Vehicle 的属性,因为我们无法在聚合中的对象之间遍历。我希望我错了?
  • @KarlM.W.对不起,我的错,我误解了你的问题。查看更新的答案。
  • 完美,谢谢@JohnnyHK。这是我从自己的调查中倾向于得到的结果,但希望有一种更精简的方法。
猜你喜欢
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 2019-07-09
  • 2019-09-18
相关资源
最近更新 更多