MongoDB / PyMongo返回与另一个文档分组匹配的文档

时间:2013-11-22 12:59:50

标签: python mongodb pymongo

我在MongoDB中有两个集合:

  1. 车辆
  2. 测试
  3. 测试包含评估分数,其中包括属性“_vehicle_id”

    我需要在过去5次测试的至少3次中返回所有得分高于70的车辆(存储为int)(使用“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”)一样简单,但我不担心......

    感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

MongoDB不支持连接,因此单个MongoDB查询(findaggregate)只能访问单个集合中的文档。

因此,在这种情况下,您必须使用test.aggregate查询跟踪获取车辆ID的db.vehicles.find({_id: {$in: vehicle_ids}})来电,以获取vehicle_ids所在的那些ID的车辆文档您根据aggregate结果生成的ID数组。