2012-01-19 2 views
0

Я только начал работать с mongodb получил perl-скрипт, который анализирует поток twitter и добавляет его в mongodb. Эта часть работает нормально.Как получить новые записи в mongodb?

Однако я задерживаю запрос базы данных в PHP. У меня есть комбинация ajax и php для запроса базы данных и в настоящее время получает последние 30 записей. Теперь я хочу, чтобы страница после стольких секунд получала последние записи. С базой данных mysql я бы просто передал идентификатор в качестве параметра и получил последнюю информацию из базы данных, однако я не совсем уверен, как подойти к нему для mongodb.

Два варианта, которые я придумал, - это использовать количество документов в коллекции и использовать это, чтобы получить последние документы, пропускающие их, или вернуться к сценарию perl и преобразовать метку времени из твиттера в более простой формат.

Есть ли более простой способ сделать это?

ответ

1

Пропуск в MongoDB (как в реляционной базе данных) является очень дорогостоящим, особенно когда коллекция базы данных растет до очень большого размера (в качестве коллекции потока твиттера). Это связано с тем, что Mongo должен буквально сортировать и проверять всю коллекцию, а затем перебирать, но не возвращать количество пропущенных документов.

Лучший способ решить эту проблему - использовать запрос для поиска в нужном месте в вашей коллекции и затем вернуть новые результаты из этой точки. Я предполагаю, что ваши документы твитов имеют поле метки времени (дата BSON). Когда вы создаете страницу (или обновляете ее через AJAX), вам нужно будет запомнить последнюю дату того, что вы видели до сих пор. После этого вы можете запросить новые твита, как:

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

Это будет эффективным при условии, у вас есть индекс по timestamp (или композитному индексу, в котором timestamp является первым полем).

+0

Спасибо за объяснение, это помогло много понять, что это работает, особенно с количеством твитов, которые я начал собирать, будет необходимо, чтобы он хорошо работал в будущем – DanM

0

С базы данных MySQL я бы просто передать идентификатор обратно в качестве параметра и получить последнюю из базы данных, однако я»не совсем уверен, как подойти к его MongoDB

Точно так же :) ObjectId основан на временных отметках, поэтому вы можете просто использовать $ gt для получения вновь вставленных документов. Например, у вас есть 2 объекта в коллекции foo:

> 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.

Смежные вопросы