2015-10-25 5 views
1

У меня есть модель с именем Shop, которая имеет name, image. Существует вероятность, что будет несколько магазинов с тем же именем.Mongoid, агрегатные модели по названию и номеру

Например, если у меня есть эти магазины:

[{_id: "1", name: "Shop A", image: "ImageShopA.jpg"}, 
    {_id: "2", name: "Shop A", image: "ImageShopA1.jpg"}, 
    {_id: "3", name: "Shop B", image: "ImageShopB.jpg"}, 
    {_id: "4", name: "Shop B", image: "ImageShopB1.jpg"}, 
    {_id: "5", name: "Shop C", image: "ImageShopC.jpg"}] 

Я хочу, чтобы получить этот вид результата:

[{name: "Shop A", ids: ["1", "2"], image: "ImageShopA.jpg"}, 
    {name: "Shop B", ids: ["3", "4"], image: "ImageShopB.jpg"}, 
    {name: "Shop C", ids: ["5"], image: "ImageShopC.jpg"}] 

Это создает JSON-объекты, имеет идентификаторы сгруппированных моделей, которые сгруппированы по name и получить изображение первой найденной модели.

Можно ли это сделать с помощью агрегации?

ответ

1

Да, возможно. Если вы запустите следующую агрегацию трубопровод в Монго оболочке с данной выборкой данных

db.collection.aggregate([ 
    { 
     "$sort": { 
      "_id": 1 
     } 
    }, 
    { 
     "$group": { 
      "_id": "$name", 
      "ids": { 
       "$push": "$_id" 
      }, 
      "image": { 
       "$first": "$image" 
      } 
     } 
    }, 
    { 
     "$project": { 
      "name": "$_id", "ids": 1, "image": 1 
     } 
    } 
]) 

вы получите желаемые результаты:

/* 0 */ 
{ 
    "result" : [ 
     { 
      "_id" : "Shop C", 
      "ids" : [ 
       "5" 
      ], 
      "image" : "ImageShopC.jpg", 
      "name" : "Shop C" 
     }, 
     { 
      "_id" : "Shop B", 
      "ids" : [ 
       "3", 
       "4" 
      ], 
      "image" : "ImageShopB.jpg", 
      "name" : "Shop B" 
     }, 
     { 
      "_id" : "Shop A", 
      "ids" : [ 
       "1", 
       "2" 
      ], 
      "image" : "ImageShopA.jpg", 
      "name" : "Shop A" 
     } 
    ], 
    "ok" : 1 
} 

Вам нужно будет преобразовать это в соответствующую рубиновой реализацию внешнего

+0

Работали как обаяние. Спасибо! –

Смежные вопросы