Costumava haver uma seção no manual que declarava explicitamente que DBRef não é suportado pela estrutura de agregação, juntamente com vários outros tipos de BSON.
A passagem antiga é lida conforme mostrado neste arquivo do Google Groups mensagem:
Pode ainda estar lá em algum lugar, mas eu simplesmente não consigo encontrá-lo agora :)
Além disso, como mencionado nesse tópico de mensagem, além de não ser suportado na estrutura de agregação, sua outra opção (e única opção real para agregação) é usar o mapReduce método em vez disso. Como um exemplo de shell:
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 } }
)
Não parece tão bom por causa do arbitrário
{ "_id": "", "value": { } }
estrutura dos resultados do mapReduce, mas permite o tipo de agregação que você está procurando. Também há referência a este problema do JIRA:SERVER-14466 , mas eu não aguentaria muito movimento nessa frente.
Portanto, você pode usar mapReduce, mas seria aconselhável deixar de usar DBRef e definir uma forma alternativa de "referências manuais", incorporando informações de "coleção" e "banco de dados" ou confiando na definição externa de tais coisas em seu esquema de aplicativo, dependendo em suas necessidades. Contanto que você siga as mesmas regras, poderá usar a estrutura de agregação para qualquer coisa com nomes de propriedade válidos.