2012-06-09 26 views
0

我有條目的這樣一個集合:不同的組通過使用MongoDB的具有pymongo

db.mesh_captors.save({'arduino': 0xCB, 'pin': 14, 'value': 35, 'date': datetime.utcnow()}) 
db.mesh_captors.save({'arduino': 0xCB, 'pin': 14, 'value': 63, 'date': datetime.utcnow()}) 
db.mesh_captors.save({'arduino': 0xCB, 'pin': 15, 'value': 126, 'date': datetime.utcnow()}) 
db.mesh_captors.save({'arduino': 0x7B, 'pin': 14, 'value': 121, 'date': datetime.utcnow()}) 

我想獲得一個Arduino的每個引腳的最後一個值。有了MySQL,我會寫下:

SELECT DISTINCT pin, value 
FROM mesh_captors 
WHERE arduino = 203 
GROUP_BY pin 
ORDER BY date DESC 

但是使用MongoDB,我不太確定如何去做。

我嘗試了這樣的東西,但它足夠好嗎?

reducer = Code(""" 
       function (doc, out) { 
        if(out.date == 0 || out.date < doc.date) { 
         out.date = doc.date; 
         out.value = doc.value; 
        } 
       } 
       """) 

captors_value = db.mesh_captors.group(key=['pin'], condition={'arduino': int(arduino_id)}, reduce=reducer, initial={'date': 0}) 

現在,我花了超過4.5秒來執行請求,並且隨着條目數量的增長,它需要越來越多的時間。

+0

。很混亂?請簡化 – Rishabh

+0

好吧,我沒有重新考慮我的問題 – Natim

+0

你有沒有在'pin'上定義一個索引,'arduino' – Rishabh

回答

2

如果您可以使用即將發佈的2.2版本的開發版本2.1版,那麼您可以使用新的aggregation framework以比map/reduce更快的速度執行此查詢。

這裏是什麼aggregation pipeline會是什麼樣得到適合該arguino和銷最近日期的值:

[{$match:{arduino: 0xCB}}, 
{$project: 
     {_id: 0, arduino:1, pin:1, maxVal: {date:1, val:"$value"} } 
}, 
{$group: 
     {_id:{"arduino":1, "pin":1},maxDate:{$max:"$maxVal"} }  
}, 
{$project: 
     {_id:0, "arduino":"$_id.arduino" , "pin":"$_id.pin","date":"$maxDate.date",value:"$maxDate.val"} 
}] 

如果您的樣本數據上運行,其結果是:

> db.mesh_captors.aggregate(agg) 
{ 
    "result" : [ 
     { 
      "arduino" : 203, 
      "pin" : 15, 
      "date" : "Sat Jun 09 2012 16:22:50 GMT-0700 (PDT)", 
      "value" : 126 
     }, 
     { 
      "arduino" : 203, 
      "pin" : 14, 
      "date" : "Sat Jun 09 2012 16:23:00 GMT-0700 (PDT)", 
      "value" : 63 
     } 
    ], 
    "ok" : 1 
} 

您可以通過對db.runCommand的pymongo支持從Python訪問彙總框架。您將執行db.runCommand通過它你問那麼問題標記部分爲答案,然後編輯並問另外一個問題的文件

{"aggregate":"mesh_captors", "pipeline":<pipeline-goes-here>} 
0

您不能在分片集合中使用組,並且使其成爲大多數任務的不好選擇。如果你不使用可能接近最佳性能的分片集合,你可以得到。 (如果我錯了,請糾正我)您應該嘗試使用MapReduce執行相同的任務並彙總和比較性能。

This article應該可以幫助您更好地理解來自mongodb的一些高級聚合。

+0

我沒有使用分片,但我認爲,我必須實現一些cron作業,這將刪除舊數據,所以我會保持11ms的速度。 – Natim