2012-01-19 18 views
0

私はちょうどmongodbを使って作業を始めましたが、twitterストリームを解析してmongodbに追加するperlスクリプトを手に入れました。この部分はすべて正常に動作しています。mongodbで新しいレコードを取得するには?

しかし、私はPHPでデータベースを照会していません。私はajaxとphpの組み合わせをデータベースに問い合わせていますが、現在は最後の30項目を取得しています。今、私は数秒後に最新のエントリを取得した後にページを持っていきたいと思っています。 mysqlデータベースでは、パラメータとしてIDを渡してデータベースから最新の情報を取得しますが、mongodbにどのように接近するのかは十分にはわかりません。

私が考案した2つの選択肢は、コレクション内のドキュメントの数を使用して最新のドキュメントを取得してそのドキュメントをスキップしたり、perlスクリプトに戻り、タイムスタンプをtwitterから簡単なフォーマット。

これを行う簡単な方法はありますか?

答えて

1

MongoDBをスキップする(リレーショナルデータベースのように)場合は、特にデータベースコレクションが非常に大きなサイズになった場合(twitterストリームコレクションの場合など)は非常にコストがかかります。これは、Mongoが文字通りコレクション全体をソートしてスキャンし、スキップしているドキュメントの数を反復して返します。

この問題を解決するには、クエリを使用してコレクション内の適切な場所に「シーク」し、そのポイントから新しい結果を返すことをお勧めします。あなたのツイートドキュメントにタイムスタンプフィールド(BSON日付)があると仮定します。ページをレンダリングする(またはAJAXで更新する)場合、これまでに見たものの最新の日付を覚えておく必要があります。これは、あなたがtimestampのインデックス(またはtimestampが最初のフィールドである複合インデックス)を持っていると仮定すると、効率的になります

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

:次に、あなたのような新しいツイートを照会することができます。私はちょうどパラメータとして戻ってIDを渡すmysqlデータベースで

+0

説明をいただきありがとうございます。これは、効率的な収集を開始した量のつぶやきが将来的にはうまくいくためには必要です – DanM

0

と は、しかし、私は」かなりわからないどのように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フィールド。

関連する問題