es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo obtener los nombres de campo dentro de una matriz de colección en mongoDB?

Estoy intentando obtener los nombres de campo presentes en la colección de mongo DB, hasta ahora he construido esto:

Pero el problema es que si la colección tiene algún arreglo, entonces no puedo acceder a los campos dentro de él, ¿alguien puede ayudar o guiar en la dirección correcta? TIA

Aquí hay un registro de muestra de la colección

{
  "class": "com.json.SvnCommitMst",
  "id": "38735",
  "author": "10662365",
  "commitDate": ISODate( "2021-09-30T08:28:01.159Z"),
  "isLatest": false,
  "mapSvnFilesMst": [
    {
      "_id": ObjectId( "618df1b32109446cb6ef58d6"),
      "commitAction": "MODIFY"
    }
  ],
  "message": "Rohit:\n\nUser Repo tool validation changes",
  "projectToolId": 92
}

La respuesta que estoy obteniendo con la consulta actual es:

{
    "_id" : null,
    "allkeys" : [ 
        "isLatest", 
        "author", 
        "_id", 
        "message", 
        "projectToolId", 
        "_class", 
        "mapSvnFilesMst", 
        "commitDate"
    ]
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para obtener los nombres de los campos presentes en una colección de MongoDB, se puede modificar la canalización de agregación existente para manejar también las matrices. Modifique la etapa “$ project” incluyendo una declaración condicional para verificar si el tipo del valor del campo es una matriz. Si es una matriz, desarrolle la matriz y proyecte sus campos agregando el prefijo a su nombre de campo. Aquí está la canalización de agregación modificada:

    db.getCollection('appd_application_master').aggregate([  
      { 
        "$project": { 
          "arrayofkeyvalue": {"$objectToArray": "$$ROOT"} 
        } 
      }, 
      { 
        "$unwind": "$arrayofkeyvalue" 
      }, 
      { 
        "$project": { 
          "fieldname": { 
            "$concat": [ 
              "$arrayofkeyvalue.k", 
              { "$cond": [{"$isArray": "$arrayofkeyvalue.v"}, ".", ""] } 
            ] 
          }, 
          "fieldvalue": { "$ifNull": [ "$arrayofkeyvalue.v", null ] } 
        } 
      }, 
      { 
        "$group": { 
          "_id": null, 
          "allkeys": { "$addToSet": "$fieldname" } 
        } 
      }, 
      { 
        "$unwind": "$allkeys" 
      } 
    ]);
    

    Esta canalización de agregación modificada incluye una etapa adicional “$project” para manejar los campos dentro de la matriz. Aquí, utilizamos el operador “$cond” para comprobar si el valor del campo es una matriz o no. Si es una matriz, utilizamos el operador “$concat” para agregar un prefijo de punto “.” a su nombre de campo. Luego, agrupamos el resultado por los nombres de campo y devolvemos todos los nombres de campo únicos utilizando el operador “$addToSet”.

    Con esta canalización de agregación modificada, debería poder obtener todos los nombres de campo, incluidos los campos dentro de la matriz.

    ¡Espero que esto ayude!

Comments are closed.