Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

235
Vistas
Obtenga el recuento de los atributos del producto de MongoDB

Tengo una colección mongo de productos con atributos:

 { "_id" : ObjectId("5888a2860c001d31a1089958"), "product_id" : "107", "store_id" : 0, "attributes" : [{ "key" : "m", "value" : 21, "label" : "Mothercare" }, { "key" : "sp", "value" : 10.0, "label" : 10.0 }, { "key" : "pr", "value" : 2, "label" : "150-300" }, { "key" : "c", "value" : 59, "label" : "Category 1" }, { "key" : "c", "value" : 86, "label" : "Category 2" }, { "key" : "c", "value" : 134, "label" : "Category 3" }, { "key" : "c", "value" : 1013, "label" : "Category 4" }, { "key" : "c", "value" : 1063, "label" : "Category 5" }, { "key" : "c", "value" : 1073, "label" : "Category 6" }, { "key" : "13", "value" : 270, "label" : "Brown" }, { "key" : "18", "value" : 125, "label" : "Girl" }, { "key" : "19", "value" : 298, "label" : "0-3 month" }, { "key" : "19", "value" : 299, "label" : "3-6 month" }, { "key" : "19", "value" : 300, "label" : "6-9 month" }, { "key" : "19", "value" : 301, "label" : "9-12 month" }] }

Necesito encontrar una forma rápida de contar todos los atributos de la colección. He intentado usar MapReduce:

 function map() { var max = this.attributes.length; var key = {}; for (var i = 0; i < max; i++) { key = { key: this.attributes[i]['key'], value: this.attributes[i]['value'], } emit(key, {count: 1}); } } function reduce(key, values) { var sum = 0; values.forEach(function(value) { sum += value['count']; }); return {count: sum}; };

Pero es muy lento:

 timeMillis=2420 counts={ "input" : 18963, "emit" : 221232, "reduce" : 7341, "output" : 1289 }

¿Cómo puedo encontrar la cantidad de todos los atributos más rápido? Lo necesito para filtro de producto. ¿Tal vez debo usar otra estructura de colección?

No necesito encontrar el recuento total de atributos, necesito encontrar el recuento de cada atributo , por ejemplo:
{ "clave": "c", "valor": 59} tiene 2345 productos
{ "clave": "m", "valor": 21} tiene 258 productos

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Ejecutar la siguiente canalización le dará el resultado deseado:

 db.collection.aggregate([ { "$unwind": "$attributes" }, { "$group": { "_id": { "key": "$attributes.key", "value": "$attributes.value" }, "counts": { "$sum": 1 } } } ])

Para una consulta más eficiente, use el marco de agregación. Considere ejecutar una canalización con $project para obtener la cantidad de atributos por documento usando el operador $size en la matriz de attributes y luego una canalización final $group donde puede especificar un valor _id de nulo para calcular los valores acumulados para todos los documentos de entrada como un todo y calcule los conteos totales usando $sum de la siguiente manera:

 db.collection.aggregate([ { "$project": { "counts": { "$size": "$attributes" } } }, { "$group": { "_id": null, "counts": { "$sum": "$counts" } } } ])

Lo anterior devolverá el número total de atributos de TODOS los productos en una colección.


Si desea utilizar el recuento de los atributos para filtrar un producto, considere utilizar la canalización $redact como:

 var attributeCount = 12; // for example db.collection.aggregate([ { "$redact": { "$cond": [ { "$eq": [ { "$size": "$attributes" }, attributeCount ] }, "$$KEEP", "$$PRUNE" ] } } ])

Esto es equivalente a una combinación de $project y $match pipeline, aunque no es necesario especificar todos los campos en el $project pipeline, como se muestra a continuación:

 db.collection.aggregate([ { "$project": { "product_id": 1, "store_id": 1, "$attributes": 1, "counts": { "$size": "$attributes" } } }, { "$match": { "counts": { "$gte": attributeCount } } } ])

over 4 years ago · Santiago Trujillo Denunciar

0

Para obtener el recuento total de attributes por par de valores clave, puede probar esta consulta.

 db.collectionName.aggregate([ {$unwind:{"$attributes"}} {$group: { _id: {"key": "$attributes.key","value": "$attributes.value"}, count: { $sum: 1 } } }, {$project:{ key:"$_id.key", value:"$_id.value", count:1 } } ])
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda