Det brukade finnas ett avsnitt i manualen som uttryckligen angav att DBRef inte stöds under aggregeringsramverket, tillsammans med olika andra BSON-typer.
Det gamla stycket läses som visas i detta google-grupparkiv meddelande:
Det kanske fortfarande finns där någonstans men jag verkar inte hitta det just nu :)
Som också påpekats i den meddelandetråden är att förutom att detta inte stöds i aggregeringsramverket, så är ditt andra alternativ (och enda verkliga alternativet för aggregering) att använda mapReduce metod istället. Som ett skalexempel:
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 } }
)
Det ser inte lika trevligt ut på grund av den godtyckliga { "_id": "", "value": { } }
kartstruktur Minska resultaten, men det tillåter den typ av aggregering du letar efter.
Det finns även hänvisning till detta JIRA-nummer:SERVER-14466 , men jag skulle inte hålla ut för mycket rörelse på den fronten.
Så du kan använda mapReduce men det skulle vara tillrådligt att gå bort från att använda DBRef och definiera en alternativ form av "manuella referenser" som antingen bäddar in "samling" och "databas" information eller förlitar sig på extern definition av sådana saker i ditt applikationsschema, beroende på på dina behov. Så länge du följer samma regler där kan du använda aggregeringsramverket för allt med giltiga egenskapsnamn.