replicar mongo mongodb aggregation-framework

mongodb - replicar - Mongo $ grupo con $ proyecto



replicar mongodb (2)

Estoy tratando de obtener el recuento de palabras clave junto con parentId , categioryId y llcId . Mi db es

{ "_id" : ObjectId("5673f5b1e4b0822f6f0a5b89"), "keyword" : "electronic content management system", "llcId" : "CL1K9B", "categoryId" : "CL1K8V", "parentId" : "CL1K8V", }

Probé $project con $group

db.keyword.aggregate([ { $group: { _id: "$llcId", total: {$sum: 1}, } }, { $project: { categoryId: 1, total: 1 } } ])

Y me da un resultado como

{ "_id" : "CL1KJQ", "total" : 17 } { "_id" : "CL1KKW", "total" : 30 }

Pero también necesito datos reales en el resultado, por ejemplo, llcId , categoryId , keyword , total . Intenté mostrar cetgoryId y keyword usando $project pero solo muestra _id y total. ¿Qué me estoy perdiendo?


Para obtener el recuento de keyword que necesitaría para agrupar los documentos por el campo de keyword , luego use la $sum operador del acumulador para obtener el recuento de documentos. En cuanto a los otros valores de campo, ya que está agrupando todos los documentos por el valor de la palabra clave, lo mejor que puede hacer para obtener los otros campos es usar el operador $first que devuelve un valor del primer documento para cada grupo. De lo contrario, es posible que tenga que usar el operador $push para devolver una matriz de los valores de campo para cada grupo:

var pipeline = [ { "$group": { "_id": "$keyword", "total": { "$sum": 1 }, "llcId": { "$first": "$llcId"}, "categoryId": { "$first": "$categoryId"}, "parentId": { "$first": "$parentId"} } } ]; db.keyword.aggregate(pipeline)


Usted está agrupando por llcId por lo que le dará más de un llcId categoryId por llcId . Si desea categoryId como en su resultado, debe escribirlo en su consulta de grupo. Por ejemplo:

db.keyword.aggregate([ { $group: { _id: "$llcId", total: {$sum: 1}, categoryId:{$max:"$categoryId"} } }, { $project: { categoryId: 1, total: 1 } }])