Soy realmente nuevo en mongodb, vengo de un entorno sql y tengo dificultades para descubrir cómo ejecutar un informe simple que agrupará un valor de un documento anidado con un conteo y en un orden de clasificación con el conteo más alto primero.
Lo he intentado de muchas maneras a partir de lo que he encontrado en línea, pero no puedo apuntar al campo exacto que necesito para la agrupación.
Aquí está la colección.
{ "_id": { "$oid": "6005f95dbad14c0308f9af7e" }, "title": "test", "fields": { "6001bd300b363863606a815e": { "field": { "_id": { "$oid": "6001bd300b363863606a815e" }, "title": "Title Two", "datatype": "string" }, "section": "Section 1", }, "6001bd300b363863423a815e": { "field": { "_id": { "$oid": "6001bd3032453453606a815e" }, "title": "Title One", "datatype": "string" }, "section": "Section 1", }, "6001bd30453534863423a815e": { "field": { "_id": { "$oid": "6001bd300dfgdfgdf06a815e" }, "title": "Title One", "datatype": "string" }, "section": "Section 1", } }, "sections": ["Section 1"] }El resultado que necesito obtener del ejemplo anterior sería:
"Título Uno", 2
"Título Segundo", 1
Puede alguien señalarme hacia la dirección correcta? Muchas gracias.
Tener nombres de campo dinámicos suele ser un diseño deficiente.
Prueba este:
db.collection.aggregate([ { $set: { fields: { $objectToArray: "$fields" } } }, { $unwind: "$fields" }, { $group: { _id: "$fields.v.field.title", count: { $count: {} } } }, { $sort: { count: -1 } } ])Aquí hay otra forma de hacerlo. El $project descarta todo excepto la inmersión profunda en "title" . Luego solo $unwind y $sortByCount .
db.collection.aggregate([ { "$project": { "titles": { "$map": { "input": { "$objectToArray": "$fields" }, "in": "$$this.v.field.title" } } } }, { "$unwind": "$titles" }, { "$sortByCount": "$titles" } ])Pruébalo en mongoplayground.net .