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.

Mongodb – Concatenar múltiples matrices anidadas y convertir a una cadena

Tengo los siguientes documentos:

{"_id": "1", "posts": [{"text": "all day long I dream about", "datetime": "123"}, {"text": "all day long ", "datetime": "321"}]}
{"_id": "1", "posts": [{"text": "all day long I dream about", "datetime": "123"}, {"text": "all day long ", "datetime": "8888"}, {"text": "I became very hungry after watching this movie...", "datetime": "8885"}]}

Deseo concatenar los campos text en un nuevo campo y los campos datetime en un nuevo campo, al mismo tiempo que uno los elementos del arreglo en una cadena de texto de la siguiente manera:

{"_id": "1", "text": "all day long I dream about, all day long ", "datetime": "123, 321"}
{"_id": "1", "text": "all day long I dream about, all day long ,I became very hungry after watching this movie... ", "datetime": "123, 8888, 8885"}

¿Cuál es la mejor forma de hacerlo directamente en el servidor de MongoDB? ¿Existe alguna forma de hacerlo así?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, puedes lograr esto directamente en el servidor de MongoDB utilizando el pipeline de agregación. A continuación se muestra una consulta de ejemplo para lograr el resultado deseado:

    db.collection.aggregate([
      {
        "$group": {
          "_id": "$_id",
          "text": {
            "$push": "$$ROOT.posts.text"
          },
          "datetime": {
            "$push": "$$ROOT.posts.datetime"
          }
        }
      },
      {
        "$project": {
          "_id": 1,
          "text": {
            "$reduce": {
              "input": "$text",
              "initialValue": "",
              "in": {
                "$concat": [
                  "$$value",
                  {
                    "$cond": [
                      {
                        "$eq": [
                          "$$value",
                          ""
                        ]
                      },
                      "",
                      ", "
                    ]
                  },
                  {
                    "$reduce": {
                      "input": "$$this",
                      "initialValue": "",
                      "in": {
                        "$concat": [
                          "$$value",
                          {
                            "$cond": [
                              {
                                "$eq": [
                                  "$$value",
                                  ""
                                ]
                              },
                              "",
                              " "
                            ]
                          },
                          "$$this"
                        ]
                      }
                    }
                  }
                ]
              }
            }
          },
          "datetime": {
            "$reduce": {
              "input": "$datetime",
              "initialValue": "",
              "in": {
                "$concat": [
                  "$$value",
                  {
                    "$cond": [
                      {
                        "$eq": [
                          "$$value",
                          ""
                        ]
                      },
                      "",
                      ", "
                    ]
                  },
                  "$$this"
                ]
              }
            }
          }
        }
      }
    ])
    

    Explicación:

    • La primera etapa del pipeline agrupa los documentos por _id y agrega los valores de los campos text y datetime de todos los documentos del grupo en un arreglo.
    • La segunda etapa del pipeline utiliza los operadores $reduce y $concat para fusionar los elementos de los arreglos en una sola cadena separada por comas para cada campo nuevo (text y datetime).

    Nota: Los operadores $reduce y $concat utilizados en el pipeline están disponibles a partir de la versión 3.4 de MongoDB.

Comments are closed.