簡體   English   中英

如何在mongodb中獲取新記錄?

[英]How to get new records in mongodb?

我剛剛開始使用mongodb,它有一個perl腳本來解析Twitter流並將其添加到mongodb中。 這部分工作正常。

但是我一直在用PHP查詢數據庫。 我已經結合使用ajax和php來查詢數據庫,並且當前獲取最后30個條目。 現在,我想讓頁面在這么多秒后獲得最新條目。 使用mysql數據庫,我只是將id作為參數傳遞回來,並從數據庫中獲取最新信息,但是我不太確定如何為mongodb處理它。

我想到的兩個選項是使用集合中的文檔數量,並使用該數量來獲取跳過太多文檔的最新文檔,或者返回到perl腳本並將時間戳從twitter轉換為更簡單的格式。

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

在MongoDB中跳過(與在關系數據庫中一樣)是非常昂貴的,特別是當數據庫集合增長到非常大的規模時(如Twitter流集合可能)。 這是因為Mongo必須從字面上進行排序並掃描整個集合,然后遍歷但不返回要跳過的文檔數。

解決此問題的更好方法是使用查詢“搜索”到集合中的正確位置,然后從該點返回新結果。 我假設您的推文文檔中有一個時間戳字段(一個BSON日期)。 呈現頁面(或通過AJAX更新頁面)時,您需要記住到目前為止所看到內容的最新日期。 然后,您可以查詢新的推文,例如:

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

假設您有一個timestamp索引(或以timestamp為第一個字段的復合索引),這將非常有效。

使用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 }

然后你給他們看。 然后幾秒鍾后添加另一個:

>db.foo.insert(  { "_id" : ObjectId("4f17e667ef7b8b0317a8ad1d"), "a" : 4, "b" : 1, "c" : 3, "d" : 2 })

30秒后查詢時,可以使用最后顯示的ObjectId(“ 4f156022ef7b8b0317a8ad19”):

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

由於_id字段上總是有一個索引,因此執行起來很快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM