tutorial - Problema de agregación y agrupamiento de MongoDB en MeteorJS
metodo aggregate mongodb (1)
Si está utilizando el paquete agregado de meteoritos .aggregate()
para implementar un .aggregate()
en su colección, entonces solo devolverá una matriz en respuesta. Entonces, debes trabajar en una forma de colección publicada:
Meteor.publish("completedLB,function() {
var self = this;
var results = userCompleted.aggregate([
{ "$match": { "progressState": true } },
{ "$group": {
"_id": "$userId",
"progressState": { "$first": "$progressState" },
"count": { "$sum": 1 }
}},
{ "$sort": { "_id": 1 } }
]);
_.each(results,function(result) {
self.added("client_collection_name",Random.id(), {
userId: result._id,
progressState: result.progressState,
count: result.count
});
});
self.ready();
});
O para incluir los recuentos false
ya que su resultado sugerido se sugiere a sí mismo:
{ "$group": {
"_id": "$userId",
"progressState": { "$first": true },
"count": { "$sum": { "$cond": ["$progressState", 1,0] }
}},
{ "$sort": { "_id": 1 } }
Como la tubería con una evaluación $cond
para convertir a numérico.
Donde en la agregación básica solo está "totalizando" los resultados coincidentes y, por supuesto, $sort
refiere a un campo presente en el resultado, que con su ejemplo sería el valor "userId" ahora en la clave _id
de aggregation, pero podría también se debe "contar" para ordenar por el recuento total si así lo desea.
Esa parte estaba produciendo el error, ya que $sort
es un campo presente y no un valor de campo con $
notation.
Pero, por supuesto, para publicar como una colección accesible para el cliente, debe reemplazar el _id
real con algo esperado. Así que la generación aleatoria de identificadores funciona aquí, al igual que la inclusión de los otros campos.
Para obtener un poco más de detalle, y también una alternativa al paquete "hacks" que simplemente funciona con una instalación de vanilla, también hay esta respuesta por mí que tiene una lista completa como ejemplo.
Usando MongoDB en Meteor JS, ¿cómo utilizas Meteor Aggregate correctamente?
El resultado previsto es devolver usuarios agrupados por su userId y resumir un campo booleano llamado "progressState" (verdadero / falso).
Por ejemplo, el documento puede tener:
user 001 - true
user 001 - false
user 001 - true
user 003 - false
user 005 - true
pero el resultado previsto sería:
user 001: 2 true
user 003: 0 true
user 005: 1 true
etc..
Mi intento da el siguiente error:
"exception: FieldPath field names may not start with ''$''."
Aquí está mi Código Meteoro:
Meteor.publishComposite(''completedLB'', {
find: function() {
return userCompleted.aggregate([
{
$match: {
"progressState": "true"
}
},
{
$group: {
"_id": "$userId",
"count": {
"$sum": "$progressState"
}
}
},
{
$sort : {
"$progressState": -1
}
}
]);
}
});