MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Gruppo Mongodb per campo dbref

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.