2013-02-04 7 views
5

Je vois beaucoup de réponses à la question "comment puis-je obtenir toutes les valeurs uniques dans un domaine?" qui suggèrent la méthode .distinct(). Mais cela retourne un simple tableau de ces valeurs. Comment puis-je récupérer tous les documents qui ont une valeur unique d'un champ?requête MongoDB pour tous les documents avec champ unique

[{age: 21, name: 'bob'}, {age: 21, name: 'sally'}, {age: 30, name: 'Jim'}] 
Query for unique age --> 
[{age: 21, name: 'sally'}, {age: 30, name: 'Jim'}] 
or 
[{age: 21, name: 'bob'}, {age: 30, name: 'Jim'}] 

Filtrage d'une requête après le fait ne constitue pas une solution idéale, comme je veux toujours choisir, $ limite et sauter $ comme d'habitude.

+0

Quel est votre critère de sélection entre 'sally' et' bob', s'ils ont tous les deux le même âge? –

+0

En fait, quel est le critère de sélection de deux documents qui sont "sally" en général? Quel document voudriez-vous retourner? – Sammaye

+0

@RyanArtecona Vous avez prédit ma question de suivi (comment spécifier le filtre). Pour mon cas d'utilisation particulier, j'ai besoin du "dernier" enregistrement, mais je ne pensais pas qu'il serait nécessaire de brouiller les pistes ici jusqu'à voir comment quelqu'un filtrerait du tout. – Sinetheta

Répondre

3
> db.foo.insert([{age: 21, name: 'bob'}, {age: 21, name: 'sally'}, {age: 30, name: 'Jim'}]) 
> db.foo.count() 
3 
> db.foo.aggregate({ $group: { _id: '$age', name: { $max: '$name' } } }).result 
[ 
    { 
     "_id" : 30, 
     "name" : "Jim" 
    }, 
    { 
     "_id" : 21, 
     "name" : "sally" 
    } 
] 
+1

Donc tout le document doit être "reconstruit"? Et s'il y avait eu d'autres propriétés (par exemple: hauteur, poids), comment obtenons-nous l'ensemble de l'enregistrement avec le '$ max: '$ name' 'et pas seulement le nom max sur le groupe $ age? – Sinetheta

+0

C'est comme un SQL "GROUP BY", alors si les documents ont un champ appelé 'other_field', alors vous devriez ajouter à votre expression' $ group' une expression indiquant comment vous voulez grouper ce champ. Voir l'expression 'name: {$ max: '$ name'}' dans mon exemple. –

+1

Cela vous donnera l'info une personne qui n'existe pas nécessairement, '{" _id: 30 ", nom:" nom maximum de ceux avec id 30 ", other_field:" max autre_field de ceux avec id 30 "}'. (avant de modifier). Alors, quelle est la commande pour obtenir le other_field de l'enregistrement avec le $ max: '$ name'? – Sinetheta

Questions connexes