C'era una sezione nel manuale che affermava esplicitamente che DBRef non è supportato nel framework di aggregazione, insieme a vari altri tipi di BSON.
Il vecchio passaggio si legge come mostrato in questo archivio dei gruppi di Google messaggio:
Potrebbe essere ancora lì da qualche parte, ma non riesco proprio a trovarlo in questo momento :)
Inoltre, come accennato in quel thread di messaggi, a parte questo non è supportato nel framework di aggregazione, l'altra opzione (e unica opzione reale per l'aggregazione) è quella di utilizzare mapReduce metodo invece. Come esempio di 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 } }
)
Non sembra così bello a causa dell'arbitrario { "_id": "", "value": { } }
struttura di mapReduce i risultati, ma consente il tipo di aggregazione che stai cercando.
C'è anche un riferimento a questo problema JIRA:SERVER-14466 , ma non resisterei a molti movimenti su quel fronte.
Quindi puoi usare mapReduce ma ti consigliamo di allontanarti dall'usare DBRef e definire una forma alternativa di "riferimenti manuali" incorporando le informazioni di "raccolta" e "database" o basandosi su una definizione esterna di tali cose nello schema dell'applicazione, a seconda sulle tue esigenze. Se segui le stesse regole, puoi utilizzare il framework di aggregazione per qualsiasi cosa con nomi di proprietà validi.