2012-01-19 80 views
0

我剛開始使用mongodb獲得了一個perl腳本,用於解析twitter流並將其添加到mongodb中。這部分工作正常。如何獲得mongodb中的新記錄?

但是我堅持在PHP中查詢數據庫。我有一個Ajax和PHP的組合來查詢數據庫,目前獲得最後30個條目。現在,我想在這麼多秒後得到最新的條目的頁面。使用mysql數據庫,我只是將id作爲參數傳回來,然後從數據庫中獲取最新的數據,但是我不太清楚如何爲mongodb找到它。

我提出的兩個選項是使用集合中的文檔數量,並使用它獲取最新的文檔跳過那麼多,或返回到perl腳本並將時間戳從twitter轉換爲格式更簡單。

有沒有更簡單的方法來做到這一點?

回答

1

在MongoDB中跳過(如在關係數據庫中)非常昂貴,特別是當數據庫集合增長到非常大的大小時(作爲Twitter流集合可能)。這是因爲Mongo必須對整個集合進行字面排序和掃描,然後迭代,但不返回正在跳過的文檔數量。

解決此問題的更好方法是使用查詢來「查找」您的集合中的正確位置,然後從該位置返回新結果。我假設你的推文文件有一個時間戳字段(BSON日期)。當您渲染頁面(或通過AJAX更新頁面)時,您需要記住迄今爲止所看到的最新日期。然後可以查詢新的鳴叫像:

db.tweets.find({timestamp: {$gt: last_seen_timestamp}}).sort({timestamp: 1}) 

這將是有效的假設你有上timestamp索引(或其中timestamp是第一場的複合索引)。

+0

感謝您的解釋,這有助於我們理解它的作用,尤其是對於我開始收集效率的數量推文來說,它將在未來運行良好 – DanM 2012-01-20 02:01:14

0

與MySQL數據庫我只想通過ID後面作爲參數,並 從數據庫中獲得最新的,但是我」不太知道如何處理 它MongoDB的

用同樣的方法:) ObjectId基於時間戳,因此您可以使用$ gt獲取新插入的文檔。例如,你有foo的集合中的2項:

> db.foo.find().limit(10); 
{ "_id" : ObjectId("4f156018ef7b8b0317a8ad18"), "a" : 2, "b" : 4, "c" : 5, "d" : 1 } 
{ "_id" : ObjectId("4f156022ef7b8b0317a8ad19"), "a" : 4, "b" : 1, "c" : 3, "d" : 2 } 

,你告訴他們。然後幾秒鐘後另一個被添加:

查詢時30秒後
>db.foo.insert( { "_id" : ObjectId("4f17e667ef7b8b0317a8ad1d"), "a" : 4, "b" : 1, "c" : 3, "d" : 2 }) 

,您可以使用最後顯示的ObjectId(「4f156022ef7b8b0317a8ad19」):

> db.foo.find({_id : {$gt : ObjectId("4f156022ef7b8b0317a8ad19")}}).limit(10); 
{ "_id" : ObjectId("4f17e667ef7b8b0317a8ad1d"), "a" : 4, "b" : 1, "c" : 3, "d" : 2 } 
> 

這將執行快,因爲總有一個指數_id字段。