2015-09-08 3 views
2

Я изучаю mongodb, и я немного застрял в написании запроса.mongodb-aggregate, чтобы получить счет.

У меня есть следующие коллекции:

{ 
    _id : 1, 
    House: A, 
    inventory: [ 
     { 
      place: Kitchen, 
      item: fridge 
     }, 
     { 
      place: Kitchen, 
      item: stove 
     }, 
     { 
      place: Kitchen, 
      item: TV 
     }, 
     { 
      place: Bedroom, 
      item: bed 
     }, 
     { 
      place: Bedroom, 
      item: TV 
     } 
    ] 
}, 
{ 
    _id : 2, 
    House: B, 
    inventory: [ 
     { 
     .... 
     } 
    ] 
}, 

Как бы я написать запрос, возвращающий значение счетчика «места» и «пунктов»? Таким образом, выход должен быть таким:
{id: Kitchen, PlaceCount: 3, itemCount: 3} - 3 кухни, 3 предмета (холодильник, плита, телевизор)
{id: Спальня, PlaceCount: 2, itemCount: 2} - 2 спальни, 2 шт. (Кровать, телевизор)

Мне нужно, чтобы количество телевизоров учитывалось в каждом месте.

+0

Хой и добро пожаловать! Возможно, вы захотите прочитать [Как задать хороший вопрос] (http://stackoverflow.com/help/how-to-ask), что увеличивает вероятность получения полезного ответа _drastically_. Вы можете найти превосходный эссе [ESR] (https://en.m.wikipedia.org/wiki/Eric_S._Raymond) [Как задавать вопросы Smart Way] (http://catb.org/~esr/ faqs/smart-questions.html) тоже полезно. –

+0

Вы пробовали db.user.aggregate ({$ group: {_id: "$ inventory.place", PlaceCount: {$ sum: 1}, itemCount: {$ sum: 1}}}, {$ match: {} }, {$ sort: {_id: 1}})? –

+0

@AlvaroJoao Я сделал, он производит '{" _id ": [" Кухня "," Кухня "," Кухня "," Спальня "," Спальня "]," PlaceCount ": 1," itemCount ": 1}', который не имеет особого смысла –

ответ

1

Вы должны пойти с Aggregation Pipeline, который позволяет вам объединять свои данные в несколько шагов, которые вы передаете массиву.

Ваше агрегирование должно быть:

db.your_collection.aggregate([ 
    {$unwind: "$inventory" }, 
    {$group: { _id: "$inventory.place", placeCount:{$sum : 1}, items : {$push: "$inventory.item"}}}, 
    {$project: { placeCount: 1, itemsCount : {$size: "$items"}}} 
]) 

Разъяснение:

  1. $unwind производит один результат для каждого из инвентарных элементов
  2. $group в unwinded инвентаризации элементов по месту, требуя подсчет (с использованием $sum) и массив предметов (по-прежнему, используя $push)
  3. $project следующие данные ваших сгруппированных результатов предыдущего этапа, а placeCount и размер (с помощью $size) вашего массива элементов, который является itemsCount
+0

Проект - это единственное, о чем я не понимаю, но я прочитаю документацию. Спасибо за объяснение –

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