2013-11-22 26 views
0

我有兩個集合MongoDB中:匹配另一個文檔的分組是MongoDB的/ PyMongo回報文件

  1. 車輛
  2. 測試

測試包含分數評估,這包括財產「 _vehicle_id「

我需要返回所有在其最後5次測試中至少有3次測試中得分高於70(存儲爲int)的車輛(使用屬性」unit_score「) 。

我已閱讀關於子文檔,排序,限制等,但我很難單獨如何在Mongo中實現這一點。到目前爲止,我的努力一直是爲所有人檢索最後5個結果,然後用Python進行迭代,但是當我每30秒可能進行10,000次測試時,這種方法效率極低...

所以我尋找一種方式讓MongoDB/PyMongo只返回3個以上匹配的車輛文件,其中unit_score> 70.

我目前有以下代碼,它返回每個匹配車輛的ObjectId(),但是我希望它返回每個匹配的車輛對象:

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

你看過使用['聚集'](http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.aggregate)嗎? – JohnnyHK

+0

我還沒有,@JohnnyHK ...閱讀聚合,我認爲這將用於找到我的測試標準,由_vehicle_id組,SUM我的匹配,然後返回_vehicle_ids的列表。有一種方法可以在一個查詢中返回實際的唯一車輛嗎?謝謝:) –

+0

或者使用MapReduce會更好嗎? –

回答

0

MongoDB不支持連接,因此單個MongoDB查詢(無論是find還是aggregate)都只能訪問單個集合中的文檔。

因此,在這種情況下,你不得不跟進您test.aggregate調用,獲得車輛的ID與db.vehicles.find({_id: {$in: vehicle_ids}})查詢來獲取車輛文檔那些IDS其中vehicle_ids是你從aggregate結果建立ID數組。

+0

這似乎並不適用於我的要求,如果我理解正確,$首先只顯示組的第一項的屬性,這將是測試的一個實例,而不是車輛,因此沒有「顏色「和」model「作爲Test文檔的一部分,我們將無法訪問Vehicle的屬性,因爲我們無法在聚合中的對象之間進行遍歷。我希望我錯了? –

+0

@ KarlM.W。對不起,我的不好,我誤解了你的問題。查看更新的答案。 – JohnnyHK

+0

完美,謝謝@JohnnyHK。這是我從我自己的調查中得出的結果,但希望有一個更簡化的方法。 –

相關問題