sql >> Base de Datos >  >> NoSQL >> MongoDB

Grupo mongodb por campo dbref

Solía ​​haber una sección en el manual que indicaba explícitamente que DBRef no es compatible con el marco de agregación, junto con varios otros tipos de BSON.

El pasaje anterior se lee como se muestra en este archivo de grupos de Google mensaje:

Puede que todavía esté allí en alguna parte, pero parece que no puedo encontrarlo en este momento :)

También, como se mencionó en ese hilo de mensajes, aparte de que esto no es compatible con el marco de agregación, entonces su otra opción (y la única opción real para la agregación) es usar mapReduce método en su lugar. Como ejemplo 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 } }
)

No se ve tan bien debido al { "_id": "", "value": { } } arbitrario estructura de los resultados de mapReduce, pero permite el tipo de agregación que está buscando.

También hay una referencia a este problema de JIRA:SERVER-14466 , pero no esperaría mucho movimiento en ese frente.

Por lo tanto, puede usar mapReduce, pero se recomienda dejar de usar DBRef y definir una forma alternativa de "referencias manuales", ya sea incrustando información de "colección" y "base de datos" o confiando en una definición externa de tales cosas en el esquema de su aplicación, dependiendo sobre tus necesidades Siempre que siga las mismas reglas allí, puede usar el marco de agregación para cualquier cosa con nombres de propiedad válidos.