Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

240
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!