2012-01-19 4 views
0

Je viens de commencer à travailler avec mongodb a un script perl qui analyse un flux twitter et l'ajoute dans mongodb. Cette partie fonctionne très bien.Comment obtenir de nouveaux records sur mongodb?

Cependant, je suis bloqué en interrogeant la base de données en PHP. J'ai une combinaison d'ajax et de php pour interroger la base de données et obtient actuellement les 30 dernières entrées. Maintenant, je veux avoir la page après tant de secondes obtenir les dernières entrées. Avec la base de données mysql, je voudrais juste passer l'id en tant que paramètre et obtenir la dernière version de la base de données mais je ne sais pas trop comment l'aborder pour mongodb.

Les deux options que j'ai trouvées sont d'utiliser le nombre de documents dans la collection et de l'utiliser pour obtenir les derniers documents en sautant autant ou pour revenir au script perl et convertir l'horodatage de twitter en format plus facile.

Existe-t-il un moyen plus simple de le faire?

Répondre

1

L'omission dans MongoDB (comme dans une base de données relationnelle) est très coûteuse, en particulier lorsque la collection de base de données atteint une taille très importante (comme pourrait le faire une collection de flux twitter). C'est parce que Mongo doit littéralement trier et analyser toute la collection, puis itérer mais pas retourner le nombre de documents que vous sautez.

Une meilleure façon de résoudre ce problème est d'utiliser une requête pour «rechercher» au bon endroit dans votre collection, puis de renvoyer de nouveaux résultats à partir de ce point. Je suppose que vos documents de tweet ont un champ d'horodatage (une date BSON). Lorsque vous rendez la page (ou la mettez à jour via AJAX), vous devez vous souvenir de la dernière date de ce que vous avez vu jusqu'à présent. Ensuite, vous pouvez interroger pour les nouveaux tweets comme:

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

Ce sera efficace en supposant que vous avez un index sur timestamp (ou un indice composite dans lequel timestamp est le premier champ).

+0

Merci pour l'explication, cela a beaucoup aidé à comprendre que cela fonctionne surtout avec le nombre de tweets que j'ai commencé à recueillir l'efficacité sera nécessaire pour que ça fonctionne bien dans le futur – DanM

0

Avec la base de données mysql je voudrais juste passer l'id de retour en tant que paramètre et obtenir la dernière base de données mais je » pas tout à fait sûr de savoir comment approche pour MongoDB

De la même façon :) ObjectId est basé sur les horodatages, vous pouvez donc simplement utiliser $ gt pour obtenir les documents nouvellement insérés. Par exemple, vous avez 2 articles dans la collection 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 } 

et vous les affichez. Puis, après quelques secondes une autre est ajouté:

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

lorsque la requête après 30sec, vous pouvez utiliser la dernière ObjectId (le « 4f156022ef7b8b0317a8ad19 ») montre:

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

Ceci effectuera rapidement car il y a toujours un index sur champ _id.