2013-04-15 5 views
0

Mon application enregistre des données dans la collection MongoDB. Il existe trois types d'événements: 'event1', 'event2', 'event3'. Et cet élément ajoute périodiquement. exemple de la structure de l'événement:Sélectionnez les derniers documents dans MongoDB

{ 'Data' : 'a234235', 'Type' : 'event1', 'Timestamp' : 1366006599 } 
{ 'Data' : 'b978543', 'Type' : 'event2', 'Timestamp' : 1366006600 } 
{ 'Data' : 'c567921', 'Type' : 'event3', 'Timestamp' : 1366006601 } 
{ 'Data' : 'd327863', 'Type' : 'event1', 'Timestamp' : 1366007100 } 
{ 'Data' : 'e', 'Type' : 'event2', 'Timestamp' : 1366007102 } 
{ 'Data' : 'f834721', 'Type' : 'event3', 'Timestamp' : 1366007103 } 

S'il vous plaît aider à composer pour obtenir requête droit état actuel de chaque événement dans la base de données. J'ai besoin de trois éléments de types différents et d'un horodatage maximal.

+0

vous pouvez toujours tirer trois requêtes simples distinctes :) –

+0

Et quoi faire si j'ai 200 types d'événements? :) Malheureusement, ce n'est pas la meilleure solution. – msmirnov

+0

voulez-vous simplement les données pour le dernier document de chaque type d'événement? – sambomartin

Répondre

0

Vous aurez besoin d'une requête distincte pour chaque événement.

db.yourCollection.find({Type:"event1"}).sort({Timestamp:-1}).limit(1);  
db.yourCollection.find({Type:"event2"}).sort({Timestamp:-1}).limit(1);  
db.yourCollection.find({Type:"event3"}).sort({Timestamp:-1}).limit(1); 

Notez que la création d'un index sur le champ Timestamp va probablement améliorer la performance beaucoup.

Voir aussi: http://docs.MongoDB.org/manual/reference/method/cursor.sort/

+0

Y a-t-il d'autres solutions? Je voudrais le faire dans une seule fonction. – msmirnov

0

Comme vous pouvez avoir ~ 200 événements (comme indiqué dans vos commentaires sur la question), je suggère l'approche la plus efficace serait de créer un document de synthèse qui enregistre les derniers événements (par type). Cela évite de devoir effectuer des requêtes distinctes et devrait être facile à maintenir en utilisant un $set lorsque de nouveaux types d'événements sont observés.

Le résumé doc ressemblerait à ceci:

{ 
    'Event1' : { 'Data' : 'd327863', 'Timestamp' : 1366007100 }, 
    'Event2' : { 'Data' : 'e', 'Timestamp' : 1366007102 }, 
    'Event3' : { 'Data' : 'f834721', 'Timestamp' : 1366007103 } 
} 

Ce modèle pre-aggregated report évitera la nécessité de plusieurs requêtes si vous avez souvent besoin de trouver l'événement maximal par type, et économiser de l'espace (potentiellement important) pour un index sur Timestamp qui serait autrement nécessaire pour trouver la dernière entrée efficacement.

0

Vous pouvez utiliser le JavaScript suivant pour faire votre travail. L'inconvénient ici est que je suppose que vos événements sont constants sinon vous devez changer cela dans le champ de tableau "Type".

Vous pouvez l'appeler lors de la connexion à DB.

a=function() 
{ 
    var Type = new Array(); 
    Type[0]="event1"; 
    Type[1]="event2"; 
    Type[2]="event3"; 
    Type[3]="event4"; 
    Type[4]="event5"; 

    for (i=0;i<Type.length;i++) 
    { 

     var myCursor = db.foo.find({Type:Type[i]}).sort({Timestamp:-1}).limit(1); 
     myCursor.forEach(printjson); 
    } 
} 

et c'est la sortie que j'ai eu pour mon cas de test.

MongoDB shell version: 2.2.2 
connecting to: test 

{ 
    "_id" : ObjectId("516bc991cde2925693705103"), 
    "Data" : "d327863", 
    "Type" : "event1", 
    "Timestamp" : 1366007100 
} 
{ 
    "_id" : ObjectId("516bc991cde2925693705104"), 
    "Data" : "e", 
    "Type" : "event2", 
    "Timestamp" : 1366007102 
} 
{ 
    "_id" : ObjectId("516bc992cde2925693705105"), 
    "Data" : "f834721", 
    "Type" : "event3", 
    "Timestamp" : 1366007103 
} 
bye 

Notez également que, par défaut, il se connecte à tester db. L'indexation sur Type et Timestamp vous aidera dans les performances.

Questions connexes