Kiedyś w podręczniku znajdowała się sekcja, która wyraźnie stwierdzała, że DBRef nie jest obsługiwany w ramach agregacji, wraz z różnymi innymi typami BSON.
Stary fragment przeczytano tak, jak pokazano w tym archiwum grup google wiadomość:
Może nadal gdzieś tam jest, ale po prostu nie mogę go teraz znaleźć :)
Również jak wspomniano w tym wątku wiadomości, poza tym, że nie jest to obsługiwane w ramach agregacji, inną opcją (i jedyną prawdziwą opcją agregacji) jest użycie mapReduce zamiast metody. Jako przykład powłoki:
db.Products.mapReduce(
function() {
emit( this.model.$id, { "actives": [this.isActive] } );
},
function(key,values) {
var result = { "actives": [] };
values.forEach(function(value) {
value.actives.forEach(function(active) {
result.actives.push( active );
});
});
},
{ "out": { "inline": 1 } }
)
Nie wygląda to tak ładnie z powodu arbitralnego { "_id": "", "value": { } }
struktura wyników mapReduce, ale pozwala na rodzaj agregacji, której szukasz.
Istnieje również odniesienie do tego problemu JIRA:SERVER-14466 , ale nie wytrzymywałbym zbyt dużego ruchu na tym froncie.
Możesz więc użyć mapReduce, ale zaleca się odejście od używania DBRef i zdefiniowanie alternatywnej formy „ręcznych odwołań” albo osadzanie informacji „zbiorów” i „bazy danych” lub poleganie na zewnętrznej definicji takich rzeczy w schemacie aplikacji, w zależności od na Twoje potrzeby. Dopóki przestrzegasz tych samych reguł, możesz używać struktury agregacji do wszystkiego, co ma prawidłowe nazwy właściwości.