2013-06-24 3 views
1

У меня есть две коллекции, здания и ордена. Здание может иметь много ордеров (отношение 1: N). Я пытаюсь получить «десятку статистических данных» (у каких зданий больше всего заказов) с помощью структуры агрегации. Моя проблема в том, как я могу получить общее количество заказов на здание? Есть ли способ «смешать» данные из двух коллекций в одном агрегате?MongoDB Сумма агрегации по отношению

В настоящее время я делаю что-то вроде этого:

db.buildings.aggregate([ 
         { $group : _id : { street : "$street", 
              city : "$city", 
              orders_count : "$orders_count" }}, 
         { $sort : { _id.orders_count : -1 }}, 
         { $limit : 10} 
         ]); 

Но в этом случае «orders_count» предварительно вычисленное значение. Он работает, но очень неэффективен и замедляется для «живой» агрегации.

Есть ли способ подсчитать связанные заказы на здание непосредственно в агрегации (имейте в виду, что есть способ ...)?

Большое спасибо

+2

агрегация может только работать в одной коллекции - почему бы не запросить сбор заказов для этой информации? в каком порядке не содержится информация о том, для какого здания оно? если вы добавляете, какой документ заказа выглядит, возможно, мы можем предложить конкретную агрегацию. –

+0

Я сделал это над зданиями, потому что мне также нужны данные из этого сложения. У заказов есть building_id. – patrickkeller

ответ

0

Вы не говорите, как заказы относятся к зданиям в вашей схеме, но если заказ имеет здание идентификатор или имя он ссылается, только группу, что:

db.orders.aggregate({ $group : { _id: "$buildingId", 
            sum: {$sum:1} 
           } 
        }, 
        /* $sort by sum:-1, $limit:10 like you already have */ 
) 
+0

Спасибо. Кажется, это единственный правильный способ сделать это. – patrickkeller