2015-09-10 2 views
0

J'ai une collection ratings avec le champ item_id. Je dois récupérer tous les documents avec le champ item_id différent. Par exemple, supposons que j'ai ces documents:Obtenir des documents avec un champ unique - Mongoid

{item_id: "123", some_other_field: "bla,bla"} 
{item_id: "123", some_other_field: "bla,bla"} 
{item_id: "121", some_other_field: "bla,bla"} 
{item_id: "120", some_other_field: "bla,bla"} 

Le résultat que j'ai besoin:

{item_id: "123", some_other_field: "bla,bla"} 
{item_id: "121", some_other_field: "bla,bla"} 
{item_id: "120", some_other_field: "bla,bla"} 

Comment puis-je y parvenir? J'ai vu this question où ils proposent map-reduce comme solution, mais ça devrait être quelque chose de plus facile!

Merci.

Répondre

2

C'est beaucoup plus facile si ce que vous "entendez" ici est le document "complètement distinct". Mais ce que vous avez besoin essentiellement ici est .aggregate(), et plus particulièrement $group:

Model.collection.aggregate([ 
    { "$group" => { 
     "_id" => { 
      "item_id" => "$item_id", 
      "some_other_field" => "$some_other_field" 
     } 
    }} 
]) 

Ou si vous voulez juste « distinct » sur « un » champ, puis quelque chose comme:

Model.collection.aggregate([ 
    { "$group" => { 
     "_id" => "$item_id", 
     "some_other_field" => { "$first" => "$some_other_field" } 
    }} 
]) 

Ce ne sont plus les mongoïde "documents" mais vous pouvez toujours les "renvoyer" si la structure est la même, ce qui est possible avec une petite manipulation ou l'étape de pipeline $project.

Model.collection.aggregate([ 
    { "$group" => { 
     "_id" => "$item_id", 
     "some_other_field" => { "$first" => "$some_other_field" } 
    }}, 
    { "$project" => { 
     "_id" => 0, 
     "item_id" => "$_id", 
     "some_other_field" => "$some_other_field" 
    }} 
]) 

aussi de mentionner que ce soit « sensiblement » plus vite que MapReduce, que le code utilise des opérateurs natifs de MongoDB et pas de traduction JavaScript.

Lisez le operators for aggregation pipelines comme guide général des choses que vous pouvez faire.