2013-01-12 20 views
5

mam te dokumenty w kolekcji:Łączenie dwóch pól z różnych dokumentów w MongoDB

{topic : "a", 
    messages : [ObjectId("21312321321323"),ObjectId("34535345353"),...] 
    }, 
    {topic : "b, 
    messages : [ObjectId("1233232323232"),ObjectId("6556565656565"),...] 
    } 

Czy istnieje możliwość spotkania się uzyskać wynik z kombinacji pól wiadomości? Chciałbym, aby to na przykład:

 {[ 
     ObjectId(""),ObjectId(""),ObjectId(""),ObjectId("") 
    ]} 

Myślałem, że było to możliwe z MapReduce, ale w moim przypadku dokumentów nie mają nic wspólnego. Teraz robię to w backendach używając javascript i loopów, ale myślę, że to nie jest najlepsza opcja. Dzięki.

Odpowiedz

4

Możesz użyć operatora $group w . Aby korzystać z Aggregation Framework, będziesz chciał mieć pewność, że używasz MongoDB 2.2 lub nowszego.

W przypadku użycia z $push otrzymasz wszystkie listy wiadomości połączonych ze sobą.

db.myCollection.aggregate({ $group: { messages: { $push: '$messages' } } }); 

W przypadku użycia z $addToSet otrzymasz tylko różne wartości.

db.myCollection.aggregate({ $group: { messages: { $addToSet: '$messages' } } }); 

A jeśli chcesz filtrować dół dokumenty kandydatów pierwsze, można użyć $match.

db.myCollection.aggregate([ 
    { $match: { topic: { $in: [ 'a', 'b' ] } } }, 
    { $group: { matches: { $sum: 1 }, messages: { $push: '$messages' } } } 
]); 
+0

Dzięki, myślę, że to zadziała, aktualizuję moją monondę. –

1

Jedną z opcji jest wykorzystanie struktury agregacji.

Jeśli jednak planujesz uzyskać dużą liczbę wyników (poza jedynie "lekkim" wynikiem), dokumentem wynikowym przekraczającym 16 MB lub nadmierną pamięcią systemową, musisz po prostu przejrzeć obiekty w zbiorze i łącz wyniki ręcznie (jak sugerujesz, co robisz teraz) lub ryzykuj mongodb rzucając wyjątek.

limity Aggregation można znaleźć na dole tej strony:

http://docs.mongodb.org/manual/applications/aggregation/

Biorąc pod uwagę ograniczenia, może chcesz po prostu użyć find z występem wrócić tylko messages.

(I z czymś takim jak poniżej, zdecydowanie zaleciłbym wykonanie pewnych testów wydajności w celu porównania opcji z danymi na serwerach, ponieważ "Internet" sugerowałby teraz, że niektórzy ludzie stwierdzili wolniejsze działanie Agregacji niż inne techniki).

+0

Tak, istnieją ograniczenia w strukturze agregacji. Właściwe rozwiązanie, zwłaszcza na dużą skalę, wymaga kompromisu. Nawet jeśli nie przekroczysz ograniczeń ramowych, może być bardziej skalowalne, aby scalić listy w kliencie niż w serwerze bazy danych. – jared

Powiązane problemy