2012-04-03 9 views
1

Je ne suis pas sûr que "distinct" soit le bon mot pour cela.mongodb requête "distincte"?

J'ai un système de messagerie simple en Mongo avec "expéditeur", "récepteur", "contenu".

Le problème que j'ai est dans la page de boîte de réception: disons par exemple j'ai 3 messages de John et 4 de Jack, je voudrais montrer dans ma boîte de réception seulement le dernier message envoyé par chacune de ces personnes.

J'ai cherché en ligne et je pensais cette http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Distinct serait la bonne chose, mais il ne semble pas fonctionner ou atlest je ne peux pas le faire fonctionner ... meh ..

+0

que voulez-vous dire conversion comme ??? Comme la boîte de réception Gmail? – Baba

+0

oui, eh bien .. la partie conversation n'est pas très liée. mais oui à peu près comme gmail, facebook ou tout autre système de messagerie. Je ne veux pas vraiment les regrouper, car ce serait un travail plus difficile. Je veux juste que le dernier message envoyé par quelqu'un soit affiché dans la page de boîte de réception. –

Répondre

3

Ciao Enrico,

Je ne suis pas vraiment votre question, donc je vais essayer d'expliquer comment fonctionne distincts:

Collection name: foo 

Doc no.1: {'a':1,...} 
Doc no.2: {'a':2,...} 
Doc no.3: {'a':3,...} 

Si vous exécutez:

db.runCommand({ distinct: 'foo', key: 'a' }) 

Qu'est-ce que vous obtiendrez sera:

[1,2,3] 

Et je ne pense pas que ce sera d'aucune utilité pour vous. Au lieu de cela, essayez de trier par date d'envoi et en limitant les résultats à un:

db.collection.find(<your_filters_here>).sort({<date_sent_key> : -1}).limit(1) 
+0

je ne suis pas sûr que cela fonctionnerait, si je limite le résultat par un, il donnera seulement un résultat. cela peut fonctionner si dans ma boîte de réception je parle seulement à UNE personne ... mais il y a aussi les messages d'autres personnes –

+0

Oh je vois, vous avez besoin du premier message de tous les expéditeurs. Ensuite, c'est une carte/réduire le travail. (Vous devrez mapper chaque message avec la clé: expéditeur et les réduire afin de ne prendre que le message le plus récent). – luke14free

+1

je viens de découvrir un moyen plus facile! chaque fois qu'un nouveau message est envoyé, marquez-le avec un "isLast: 1", et comme de nouveaux messages sont écrits, réglez les anciens comme isLast: 0 ... simple comme ça! –