Hay un campo 'Creado' en mi colección, el formato de fecha es fecha ISO. ¿Cómo puedo convertirlo a 'aaaa-mm-dd hh: mm: ss'?

Muestra de documento:

{
    "_id" : ObjectId("432babb4d3281999g902a378"),
    "ID" : "290283667",
    "Data" : {
        "Product-2713890" : {
            "Created" : ISODate("2016-08-23T20:55:39.437Z"),
            "Product" : "Product-2713890"
        }
    }
}

Resultado esperado:

{
    "_id" : ObjectId("432babb4d3281999g902a378"),
    "ID" : "290283667",
    "Product" : "Product-2713890",
    "Created" : "2016-08-23 20:55:39"

}

Aquí está mi código:

db.getCollection('BasicInfo').aggregate([
{$match:{Type:'subscriptions'}},
{$project: {hashmaps: { $objectToArray: '$$ROOT.Data'},ID:'$$ROOT'}},
{$project: {ID:'$ID.ID',
            Product: '$hashmaps.v.Product',
            Created: '$hashmaps.v.Created'} },
{$unwind:'$Product'},
{$unwind:'$Created'}
]) 

Intenté usar $dateToString como se muestra a continuación, pero me dio el mensaje de error: "no se puede convertir de la matriz de tipo BSON a la fecha"

db.getCollection('BasicInfo').aggregate([
{$match:{Type:'subscriptions'}},
{$project: {hashmaps: { $objectToArray: '$$ROOT.Data'},ID:'$$ROOT'}},
{$project: {ID:'$ID.ID',
            Product: '$hashmaps.v.Product',
            Created: {$dateToString:{format:'%Y-%m-%d',date:'$hashmaps.v.Created'}}} },
{$unwind:'$Product'},
{$unwind:'$Created'}
])    
1
tysss 18 nov. 2019 a las 09:24

1 respuesta

La mejor respuesta

La siguiente consulta de agregación debería obtener el resultado esperado.

Con la ayuda de $addFields < / a> y $arrayElemAt < / a> ¿por qué? porque el valor Data en el documento de muestra convertido con $objectToArray estará en el índice 0. Vínculo al parque infantil

Nota: teniendo en cuenta que el campo Data puede contener más de una información de producto, en cuyo caso, antes de elegir el primer elemento, se debe filtrar la matriz de hashmaps $filter (unidireccional) según clave de producto para resolver esto correctamente.

db.collection.aggregate([
{$match:{Type:'subscriptions'}},
  {
    $addFields: {
      hashmaps: {
        $objectToArray: "$$ROOT.Data"
      }
    }
  },
  {
    $project: {
      "ID": 1,
      "hashmaps": {
        $arrayElemAt: [
          "$hashmaps",
          0
        ]
      }
    }
  },
  {
    $project: {
      "ID": 1,
      "Product": "$hashmaps.k",
      "Created": {
        $dateToString: {
          format: "%Y-%m-%d %H:%M:%S",
          date: "$hashmaps.v.Created"
        }
      }
    }
  }
])

++ Consulta actualizada basada en comentarios: caso en el que los datos tendrían varios productos. Usando $map

db.collection.aggregate([
  {
    $addFields: {
      productsMap: {
        $objectToArray: "$$ROOT.Data"
      }
    }
  },
  {
    $project: {
      "Products": {
        $map: {
          input: "$productsMap",
          as: "p",
          in: {
            Product: "$$p.k",
            Created: {
              $dateToString: {
                format: "%Y-%m-%d %H:%M:%S",
                date: "$$p.v.Created"
              }
            },
            ID: "$ID",
            _id: "$_id"
          }
        }
      },
      _id: 0
    }
  }
])

Resultado de muestra: zona de juegos con una nueva consulta

[
  {
    "Products": [
      {
        "Created": "2016-08-23 20:55:39",
        "ID": "290283667",
        "Product": "Product-2713890",
        "_id": ObjectId("5a934e000102030405000000")
      },
      {
        "Created": "2017-07-23 20:55:39",
        "ID": "290283667",
        "Product": "Product-6943532",
        "_id": ObjectId("5a934e000102030405000000")
      }
    ]
  }]
0
ambianBeing 20 nov. 2019 a las 09:51