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
}
}])